天天看點

python 大檔案分片上傳_PHP大檔案分片上傳的實作方法

一、前言

在網站開發中,經常會有上傳檔案的需求,有的檔案size太大直接上傳,經常會導緻上傳過程中耗時太久,大量占用帶寬資源,是以有了分片上傳。

分片上傳主要是前端将一個較大的檔案分成等分的幾片,辨別目前分片是第幾片和總共幾片,待所有的分片均上傳成功的時候,在背景進行合成檔案即可。

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

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

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

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

三、問題解決

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

(1)nginx中添加client_max_body_size和client_body_buffer_size

python 大檔案分片上傳_PHP大檔案分片上傳的實作方法

(2)php.ini添加post_max_size 和 upload_max_filesize

重新開機nginx和php-fpm

代碼邏輯梳理和分享

(1)先擷取目前分片是第幾片以及總共幾片

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

python 大檔案分片上傳_PHP大檔案分片上傳的實作方法

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

python 大檔案分片上傳_PHP大檔案分片上傳的實作方法

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

python 大檔案分片上傳_PHP大檔案分片上傳的實作方法

$target變量代表合成後的檔案名,file_exists判斷是否已經合成成功,然後追加方式建立打開檔案,循環将每個分片内容寫入一個檔案中。

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

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

總結

以上所述是小編給大家介紹的PHP大檔案分片上傳的實作方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回複大家的!

您可能感興趣的文章: