PHP大檔案分片上傳的實現方法

2021-08-30 09:06:39 字數 1123 閱讀 1022

一、前言

在**開發中,經常會有上傳檔案的需求,有的檔案size太大直接上傳,經常會導致上傳過程中耗時太久,大量占用頻寬資源,因此有了分片上傳。

分片上傳主要是前端將乙個較大的檔案分成等分的幾片,標識當前分片是第幾片和總共幾片,待所有的分片均上傳成功的時候,在後台進行合成檔案即可。

二、開發過程中遇到的問題

分片的時候每片該分多大size?太大會出現「413 request entity too large」

分片上傳的時候並不是嚴格按照分片的序號順序上傳,如何判斷所有的分片均上傳成功?

合成檔案的時候如何判斷保證合成乙個完整的檔案而不出錯?多個分片同時上傳的時候,讀寫檔案沒有獨佔鎖的時候會導致合成錯誤。

三、問題解決

當出現413的時候,修改了 nginx.conf 和php.ini

(1)nginx中新增client_max_body_size和client_body_buffer_size

(2)php.ini新增post_max_size 和 upload_max_filesize

重啟nginx和php-fpm

**邏輯梳理和分享

(1)先獲取當前分片是第幾片以及總共幾片

(2)建立乙個資料夾用來儲存所有的分片以及合成的檔案

(3)變數$done初始為true,用來判斷是否所有的分片都上傳完成,每個分片儲存的時候使用分片序號作為檔名,然後判斷所有的分片檔案是否存在

(4)當$done===true的時候,代表所有分片上傳完成,合成檔案。     

$target變數代表合成後的檔名,file_exists判斷是否已經合成成功,然後追加方式建立開啟檔案,迴圈將每個分片內容寫入乙個檔案中。

在讀取每個分片之前先判斷當前分片是否存在,是為了防止多個程序執行合成檔案**塊的時候導致某個分片已經寫入刪除,最後導致合成的檔案是不完整的,此時需要刪除合成的不完整的檔案並退出exit當前程序。

其中每個分片最好設定獨佔鎖,flock($in, lock_ex),用來保證讀寫分片的時候其他程序不會操作該分片。最後刪除分片unlink以及釋放獨佔鎖。

總結

您可能感興趣的文章:

php大檔案分片上傳

html php class upload 判斷是否是最後一塊,如果是則進行檔案合成並且刪除檔案塊 private function filemerge file put contents this filepath.this filename,blob this deletefileblob 刪除...

PHP大檔案分割上傳 PHP分片上傳

服務端為什麼不能直接傳大檔案?跟php.ini裡面的幾個配置有關 upload max filesize 2m php最大能接受的檔案大小 post max size 8m php能收到的最大post值 memory limit 128m 記憶體上限 max execution time 30 最大...

大檔案上傳 webuploader分片上傳

參考 webuploder api 需求 上傳大檔案資源以及一些基礎資訊儲存到資料庫 實現思路 分為2大步 一 通過webuploader前端外掛程式分頁上傳到伺服器,伺服器合頁 二 上傳完成,設定檔案欄位名稱,再普通表單提交,儲存資訊到資料庫 難點 一步具體實現 前端頁面 分頁上傳 1,匯入web...