利用blob對象實現大文件分片上傳


  首先說分片上傳,我們在進行文件上傳的時候,因為服務器的限制,會限制每一次上傳到服務器的文件大小不會很大,這個時候我們就需要把一個需要上傳的文件進行切割,然后分別進行上傳到服務器。

  假如需要做到這一步,我們需要解決兩個問題:

  • 怎么切割?
  • 怎么得知當前傳輸的進度?

  首先解決怎么切割的問題。因為File文件對象是繼承於Blob對象的,因此File文件對象也擁有slice這個方法,我們可以使用這個方法將任何一個File文件進行切割。

  slice用於文件分片上傳:

  (1)分片與並發結合,將一個大文件分割成多塊,並發上傳,極大地提高大文件的上傳速度。

  (2)當網絡問題導致傳輸錯誤時,只需要重傳出錯分片,而不是整個文件。另外分片傳輸能夠更加實時的跟蹤上傳進度。

  具體看代碼:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>upload</title>
    <script src="https://cdn.bootcss.com/jquery/3.2.1/jquery.min.js"></script>
</head>
<body>
    <input type="file" name="file" id="file">
    <button id="upload" onClick="upload()">upload</button>
    <script type="text/javascript">
        var bytesPerPiece = 1024 * 1024; // 每個文件切片大小定為1MB .
        var totalPieces; //發送請求
 function upload() { var blob = document.getElementById("file").files[0]; var start = 0; var end; var index = 0; var filesize = blob.size; var filename = blob.name; //計算文件切片總數
            totalPieces = Math.ceil(filesize / bytesPerPiece); while(start < filesize) { end = start + bytesPerPiece; if(end > filesize) { end = filesize; } // 匹配最后一個分片的情況

                var chunk = blob.slice(start,end);//切割文件 
                var sliceIndex= blob.name + index; var formData = new FormData(); formData.append("file", chunk, sliceIndex); $.ajax({ url: 'http://localhost:9999/test.php', type: 'POST', cache: false, data: formData, processData: false, contentType: false, }).done(function(res){ }).fail(function(res) { }); start = end; index++; } } </script>
</body>
</html>

  此外還有常說的斷點續傳。

  說下簡單思路:

  1、拿到文件,保存文件唯一標識,如md5;

  2、切割文件,分段上傳;

  3、每次上傳一段,根據唯一性標識判斷文件上傳進度,直到文件的全部片段上傳完畢。

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM