日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 编程语言 > php >内容正文

php

PHP大文件分片上传

發(fā)布時(shí)間:2025/3/18 php 21 豆豆
生活随笔 收集整理的這篇文章主要介紹了 PHP大文件分片上传 小編覺得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.

一、前言

  • 在網(wǎng)站開發(fā)中,經(jīng)常會(huì)有上傳文件的需求,有的文件size太大直接上傳,經(jīng)常會(huì)導(dǎo)致上傳過程中耗時(shí)太久,大量占用帶寬資源,因此有了分片上傳。
  • 分片上傳主要是前端將一個(gè)較大的文件分成等分的幾片,標(biāo)識(shí)當(dāng)前分片是第幾片和總共幾片,待所有的分片均上傳成功的時(shí)候,在后臺(tái)進(jìn)行合成文件即可。

二、開發(fā)過程中遇到的問題

  • 分片的時(shí)候每片該分多大size?太大會(huì)出現(xiàn)“413 request entity too large”
  • 分片上傳的時(shí)候并不是嚴(yán)格按照分片的序號(hào)順序上傳,如何判斷所有的分片均上傳成功?
  • 合成文件的時(shí)候如何判斷保證合成一個(gè)完整的文件而不出錯(cuò)?多個(gè)分片同時(shí)上傳的時(shí)候,讀寫文件沒有獨(dú)占鎖的時(shí)候會(huì)導(dǎo)致合成錯(cuò)誤。
  • 三、問題解決

  • 當(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è)文件夾用來存儲(chǔ)所有的分片以及合成的文件

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

    (4)當(dāng)$done===true的時(shí)候,代表所有分片上傳完成,合成文件。 $target變量代表合成后的文件名,file_exists判斷是否已經(jīng)合成成功,然后追加方式創(chuàng)建打開文件,循環(huán)將每個(gè)分片內(nèi)容寫入一個(gè)文件中。在讀取每個(gè)分片之前先判斷當(dāng)前分片是否存在,是為了防止多個(gè)進(jìn)程執(zhí)行合成文件代碼塊的時(shí)候?qū)е履硞€(gè)分片已經(jīng)寫入刪除,最后導(dǎo)致合成的文件是不完整的,此時(shí)需要?jiǎng)h除合成的不完整的文件并退出exit當(dāng)前進(jìn)程。其中每個(gè)分片最好設(shè)置獨(dú)占鎖,flock($in, LOCK_EX),用來保證讀寫分片的時(shí)候其他進(jìn)程不會(huì)操作該分片。最后刪除分片unlink以及釋放獨(dú)占鎖。

    總結(jié)

    以上是生活随笔為你收集整理的PHP大文件分片上传的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯(cuò),歡迎將生活随笔推薦給好友。