PHP檔案上傳進度的實現原理

2022-03-15 07:27:35 字數 2603 閱讀 4404

uploadprogress擴充套件需要依靠js獲取伺服器提供的進度,這裡的進度是伺服器接收的檔案進度。

而在php5.4之後,我們可以在不新增擴充套件的情況下,從session資料中獲取了檔案上傳的進度。uploadprogress擴充套件和php5.4的session擴充套件都能獲取上傳的進度,其是否有相同的地方呢?

我們先來看uploadprogress擴充套件,**原始碼包,解圧,直接開啟檔案,我們可以在example中找到乙個簡單的示例。在info.php檔案中,uploadprogress_get_info函式用來獲取上傳檔案進度。upploadprogress.c檔案儲存了擴充套件的實現過程。uploadprogress擴充套件實現的關鍵在於其模組寢化函式:

1 23 4

5 6 7

php_minit_function(uploadprogress)

此函式的核心就是設定php_rfc1867_callback為uploadprogress_php_rfc1867_file。

設定這個函式指標有什麼用呢?

在前面的文章php核心中檔案上傳型別的獲取過程中我們了解到php處理post請求的函式是sapi_post_handler_func(rfc1867_post_handler)(main/rfc1867.c)。在這裡, 我們發現了若干個php_rfc1867_callback的呼叫,從呼叫的第乙個引數來看,它可以分為六個事件,或者說有六個**更新點。

如果此時我們檢視php5.4的的session擴充套件的實現檔案session.c時,搜尋php_rfc1867_callback,你會發現在模組初始化函式中也有與擴充套件類似的賦值操作: 1

php_rfc1867_callback = php_session_rfc1867_callback;

同樣,在php_session_rfc1867_callback函式中有與uploadprogress同樣的六個事件的處理,這六個事件相當於六個鉤子程式,分別對應post請求的處理的六個不同的位置,在php5.4中他們的作用分別是:

1、multipart_event_start 在處理所有的請求實體之前,初始化上傳進度資訊,比用於記錄上傳進度相關資訊的progress結構體資訊(如content-length)

2、multipart_event_formdata 對於每個multipart包含的控制,執行此步初始化操作,以此之前會解析content-disposition相關屬性,並初始化progress的其它資訊,如session_id,以及整個上傳活動的key,這裡表示整個上傳進度準備好了。

3、multipart_event_file_start 開始處理上傳的檔案資訊,如果progress的data不存在,則會建立此結構,並初始化session中儲存的對於此次檔案上傳的start_time、content_length、bytes_processed、files等資訊。然後處理單個檔案的上傳屬性,如field_name、tmp_name等。對於tmp_name等字段這裡是執行初始化操作。這一步的時候獲取session 的值才會開始有上傳進度的相關資訊。

4、multipart_event_file_data 更新上傳檔案的長度,在一堆的檔案相關資訊檢測和臨時檔案寫入之前,也是在將資料寫入到$_files之前。

5、multipart_event_file_end 單個檔案上傳結束,此時會更新這個檔案相關的一些資訊,比如error, tmp_name,tmp_name欄位在start時是null。當然這裡還有針對當前檔案的done欄位的更新。

6、multipart_event_end 更新session陣列的最後的一些結資訊 比如done欄位 並清空progress的資訊,

這裡的六個事件是相同的,而uploadprogress擴充套件和php5.4的session擴充套件在事件處理過程中中間儲存結構和最後的返回內容與方式上存在一些差異。uploadprogress擴充套件的儲存結構為乙個按照擴充套件制定的規則生成的臨時檔案,最後是通過擴充套件函式uploadprogress_get_info返回上傳進度的陣列。php5.4的儲存結構為session的儲存方式,或者是檔案,或者是memcache,這個按session的設定來,其最終是通過$_session返回相關陣列。

除了uploadprogress擴充套件外,apc也以設定php_rfc1867_callback = apc_rfc1867_progress,提供了類似的解決方案,啟動此功能需要在php.ini中設定apc.rfc1867項為啟用,並且在表單中加乙個隱藏域 apc_upload_progress,這個域的值可以隨機生成乙個hash,以確定此次上傳操作的唯一性。通過ajax呼叫服務端顯示進度的介面,在介面中通過apc_fetch函式獲取apc快取的檔案上傳進度。比如print_r(apc_fetch(」upload_$_post[apc_upload_progress]「));可以得到如下結果:

1 23 4

5 67 8

9 10

11 array

(     [total] => 1142543

[current] => 1142543

[rate] => 1828068.8

[filename] => test

[name] => file

[temp_filename] => /tmp/php8f

[cancel_upload] => 0

[done] => 1 )

PHP檔案上傳的原理及實現

php檔案上傳的原理及實現 利用php的檔案函式來實現上傳 這段 分為兩個檔案,乙個為upload.html,乙個是upload.php 其中,請注意 這是乙個標籤,我們要實現檔案的上傳,必須指定為 multipart form data,否則伺服器將不知道要幹什麼。值得注意的是檔案upload.h...

php上傳檔案並顯示上傳進度的方法

記得上傳檔案的時候要大點,不然還沒看出來就上傳完了,並且上傳的檔案不要太大,上g的就算了,2g的我試了,php受不了,我測試的是300多m的,記得要調整小php.ini引數啊 選檔案 提交 獲取資訊 要一氣呵成哦 name ini get session.upload progress.name k...

php 上傳大檔案原理,剖析PHP上傳大檔案原理

php給我帶來了更方便的程式設計,但是我們在使用時以會遇到問題,這裡就談談php上傳大檔案的小問題吧。由於涉及到本地和伺服器兩方面的安全問題,所以基於input type file 形式的頁面檔案上傳一直處於乙個很尷尬的位置。一方面,使用者不希望隱私洩露,所以瀏覽器無法對使用者在上傳時選擇的檔案做有...