PHP大文件分片上傳的實現方法

 更新時間:2018年10月28日 12:35:18   投稿:mrr   我要評論

在網站開發中,經常會有上傳文件的需求,有的文件size太大直接上傳,經常會導致上傳過程中耗時太久,大量占用帶寬資源,因此有了分片上傳。接下來通過本文給大家介紹PHP大文件分片上傳的實現方法,需要的朋友可以參考下

一、前言

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

分片上傳主要是前端將一個較大的文件分成等分的幾片,標識當前分片是第幾片和總共幾片,待所有的分片均上傳成功的時候,在后臺進行合成文件即可。

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

  1. 分片的時候每片該分多大size?太大會出現“413 request entity too large”
  2. 分片上傳的時候并不是嚴格按照分片的序號順序上傳,如何判斷所有的分片均上傳成功?
  3. 合成文件的時候如何判斷保證合成一個完整的文件而不出錯?多個分片同時上傳的時候,讀寫文件沒有獨占鎖的時候會導致合成錯誤。

三、問題解決

當出現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大文件分片上傳的實現方法,希望對大家有所幫助,如果大家有任何疑問歡迎給我留言,小編會及時回復大家的!

相關文章

  • 使用PHP生成圖片的縮略圖的方法

    使用PHP生成圖片的縮略圖的方法

    這篇文章主要介紹了使用PHP生成圖片的縮略圖的方法,一些常見的圖片格式都可以支持,需要的朋友可以參考下
    2015-08-08
  • 提高php編程效率技巧

    提高php編程效率技巧

    php是全球范圍應用范圍最廣的開發語言,php和linux、apache、mysql緊密結合,形成了lamp的開源黃金搭檔。因其php具有開發周期短、免費、穩定、安全、簡單易學、跨平臺等優勢,被評為最受歡迎的編程語言,下面小編給大家整理了提高php編程效率的20個要點,需要的可以參考
    2015-08-08
  • PHP Web木馬掃描器代碼分享

    PHP Web木馬掃描器代碼分享

    本篇文章給大家分享一段代碼,php web木馬掃描器。需要的朋友直接復制代碼,就可以使用了,代碼超簡單,附有注釋,需要的朋友可以參考下
    2015-09-09
  • php增刪改查示例自己寫的demo

    php增刪改查示例自己寫的demo

    增刪改查是對數據庫最基本的操作,下面詳細為大家介紹下如何連接數據庫以及增刪改查等等相關知識,感興趣的朋友可以參考下
    2013-09-09
  • Zend Framework路由器用法實例詳解

    Zend Framework路由器用法實例詳解

    這篇文章主要介紹了Zend Framework路由器用法,結合實例形式分析了Zend Framework路由器的功能、定義與基本使用方法,需要的朋友可以參考下
    2016-12-12
  • PHP查看當前變量類型的方法

    PHP查看當前變量類型的方法

    這篇文章主要介紹了PHP查看當前變量類型的方法,需要的朋友可以參考下
    2015-07-07
  • php面向對象中的魔術方法中文說明

    php面向對象中的魔術方法中文說明

    這篇文章主要介紹了php面向對象中的魔術方法中文說明,明白這些方法才好寫面向對象程序,需要的朋友可以參考下
    2014-03-03
  • Yii2使用表單上傳文件的實例代碼

    Yii2使用表單上傳文件的實例代碼

    本篇文章主要介紹了Yii2使用表單上傳文件的實例代碼,小編覺得挺不錯的,現在分享給大家,也給大家做個參考。一起跟隨小編過來看看吧
    2017-08-08
  • php大小寫轉換函數(strtolower、strtoupper)用法介紹

    php大小寫轉換函數(strtolower、strtoupper)用法介紹

    strtoupper() 函數把字符串轉換為大寫而strtolower函數: 該函數將傳入的字符串參數所有的字符都轉換成小寫,并以小定形式放回這個字符串。下面通過本文給大家分享php大小寫轉換函數(strtolower、strtoupper)用法,需要的朋友參考下吧
    2017-11-11
  • PHP類中的魔術方法(Magic Method)簡明總結

    PHP類中的魔術方法(Magic Method)簡明總結

    這篇文章主要介紹了PHP類中的魔術方法(Magic Method)簡明總結,這些方法包括__construct()、__destruct()、__call()、__callStatic()、__get()、__set()、__toString()等,需要的朋友可以參考下
    2014-07-07

最新評論

时时彩包赢公式0369