PHP大文件分片上傳的實(shí)現(xiàn)方法
以下是【金聰采編】分享的內(nèi)容全文:
一、前言
在網(wǎng)站開(kāi)發(fā)中,經(jīng)常會(huì)有上傳文件的需求,有的文件size太大直接上傳,經(jīng)常會(huì)導(dǎo)致上傳過(guò)程中耗時(shí)太久,大量占用帶寬資源,因此有了分片上傳。
分片上傳主要是前端將一個(gè)較大的文件分成等分的幾片,標(biāo)識(shí)當(dāng)前分片是第幾片和總共幾片,待所有的分片均上傳成功的時(shí)候,在后臺(tái)進(jìn)行合成文件即可。
二、開(kāi)發(fā)過(guò)程中遇到的問(wèn)題
- 分片的時(shí)候每片該分多大size?太大會(huì)出現(xiàn)“413 request entity too large”
- 分片上傳的時(shí)候并不是嚴(yán)格按照分片的序號(hào)順序上傳,如何判斷所有的分片均上傳成功?
- 合成文件的時(shí)候如何判斷保證合成一個(gè)完整的文件而不出錯(cuò)?多個(gè)分片同時(shí)上傳的時(shí)候,讀寫(xiě)文件沒(méi)有獨(dú)占鎖的時(shí)候會(huì)導(dǎo)致合成錯(cuò)誤。
三、問(wèn)題解決
當(dāng)出現(xiàn)413的時(shí)候,修改了 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)先獲取當(dāng)前分片是第幾片以及總共幾片
(2)創(chuàng)建一個(gè)文件夾用來(lái)存儲(chǔ)所有的分片以及合成的文件

(3)變量$done初始為true,用來(lái)判斷是否所有的分片都上傳完成,每個(gè)分片保存的時(shí)候使用分片序號(hào)作為文件名,然后判斷所有的分片文件是否存在

(4)當(dāng)$done===true的時(shí)候,代表所有分片上傳完成,合成文件。

$target變量代表合成后的文件名,file_exists判斷是否已經(jīng)合成成功,然后追加方式創(chuàng)建打開(kāi)文件,循環(huán)將每個(gè)分片內(nèi)容寫(xiě)入一個(gè)文件中。
在讀取每個(gè)分片之前先判斷當(dāng)前分片是否存在,是為了防止多個(gè)進(jìn)程執(zhí)行合成文件代碼塊的時(shí)候?qū)е履硞€(gè)分片已經(jīng)寫(xiě)入刪除,最后導(dǎo)致合成的文件是不完整的,此時(shí)需要?jiǎng)h除合成的不完整的文件并退出exit當(dāng)前進(jìn)程。
其中每個(gè)分片最好設(shè)置獨(dú)占鎖,flock($in, LOCK_EX),用來(lái)保證讀寫(xiě)分片的時(shí)候其他進(jìn)程不會(huì)操作該分片。最后刪除分片unlink以及釋放獨(dú)占鎖。
總結(jié)
以上所述是小編給大家介紹的PHP大文件分片上傳的實(shí)現(xiàn)方法,希望對(duì)大家有所幫助,如果大家有任何疑問(wèn)歡迎給我留言,小編會(huì)及時(shí)回復(fù)大家的!
1.軟件源碼推廣展示:目的展示軟件相關(guān)功能,接收技術(shù)學(xué)習(xí)者測(cè)試、測(cè)評(píng);
2.教程課程信息展示:展示課程信息,傳授課程各階段內(nèi)容;
3.設(shè)計(jì)素材圖片展示:展示素材設(shè)計(jì)理念、思維方式、傳播設(shè)計(jì)理念;
4.福利優(yōu)惠信息展示:分享各類最新的福利信息,各種優(yōu)惠信息展示;
以上分享目的僅供學(xué)習(xí)、參考使用,請(qǐng)勿用于其他用途,如果想商業(yè)使用或者代理,請(qǐng)自行聯(lián)系版權(quán)方獲取授權(quán)。任何未獲取授權(quán)的商業(yè)使用與本站無(wú)關(guān),請(qǐng)自行承擔(dān)相應(yīng)責(zé)任。
本站不存儲(chǔ)任何資源文件,敬請(qǐng)周知!
如果您認(rèn)為本頁(yè)信息內(nèi)容侵犯了您的相關(guān)權(quán)益(包含但不限于:著作權(quán)、首發(fā)權(quán)、隱私權(quán)等權(quán)利),或者您認(rèn)為自己是此信息的權(quán)利人但是此信息不是自己發(fā)布的,可以直接版權(quán)舉報(bào)投訴,我們會(huì)根據(jù)網(wǎng)站注冊(cè)協(xié)議、資源分享協(xié)議等協(xié)議處理,以保護(hù)您的合法權(quán)益。
本網(wǎng)站采用 BY-NC-SA 協(xié)議進(jìn)行授權(quán) 轉(zhuǎn)載請(qǐng)注明原文鏈接:PHP大文件分片上傳的實(shí)現(xiàn)方法

侵權(quán)舉報(bào)/版權(quán)申訴



