如何解決視頻切片上傳無法上傳48MB以上文件的問題?

如何解決視頻切片上傳無法上傳48MB以上文件的問題?

突破視頻切片上傳48MB限制:問題分析與解決方案

上傳大視頻時,常常采用切片上傳技術,但有時會遇到上傳超過48MB后,后續切片返回500錯誤的問題。本文將深入分析此問題,并提供有效的解決方案。

問題現象

采用1MB切片大小,最大支持2GB文件上傳。小文件上傳正常,但超過48MB后,后續切片均返回500錯誤。即使將切片大小調整為10MB,問題依舊存在,每次只能上傳4個切片(40MB)。

根源及解決方法

1. 前端FormData處理

問題可能源于前端FormData的處理方式。原始代碼中,FormData對象未在每次請求前重新初始化,導致每次請求都攜帶所有之前的切片數據,最終請求大小超過apache服務器的fcgidmaxrequestlen限制,引發500錯誤。

解決方案:

  • 將new FormData()操作移入sendFile函數內部,確保每次請求使用新的FormData對象。
  • 或者,使用set方法代替append方法,避免重復添加相同鍵值的數據。
  • 務必在setTimeout的else分支中使用clearTimeout(t)清除計時器,避免內存泄漏。

以下是修改后的前端代碼示例:

    <meta charset="UTF-8"></meta><meta content="width=device-width, user-scalable=no, initial-scale=1.0, maximum-scale=1.0, minimum-scale=1.0" name="viewport"></meta><meta content="ie=edge" http-equiv="X-UA-Compatible"></meta><title>Document</title><hr></hr>Go!       var fileUpload = new videoFileUpload();     up.onclick = _ => fileUpload.start();      function videoFileUpload() {         const LENGTH = 1024 * 1024;         var start = 0;         var end = start + LENGTH;         var blob;         var blob_num = 1;         var is_stop = 0;          this.start = function () {             var file = files.files[0];             blob = cutFile(file);             sendFile(blob, file);             blob_num += 1;         }         this.stop = function () {             is_stop = 1;         }          function cutFile(file) {             var file_blob = file.slice(start, end);             start = end;             end = start + LENGTH;             return file_blob;         };          function sendFile(blob, file) {             if (is_stop == 0) {                 var xhr = new XMLHttpRequest();                 var form_data = new FormData(); //此處重新初始化FormData                  var total_blob_num = Math.ceil(file.size / LENGTH);                 form_data.append('file', blob);                 form_data.append('blob_num', blob_num);                 form_data.append('total_blob_num', total_blob_num);                 form_data.append('file_name', file.name);                  xhr.open('POST', '/upload.php', false);                 xhr.onreadystatechange = function () {                     var t = setTimeout(function () {                         if (start < file.size) {                             blob = cutFile(file);                             sendFile(blob, file);                             blob_num += 1;                         } else {                             clearTimeout(t); //此處清除計時器                         }                     }, 1000);                 }                 xhr.send(form_data);             }         }     }

2. 后端文件合并優化

后端合并文件時,如果一次性將所有切片讀入內存,大文件可能導致內存溢出。

解決方案:

  • 使用流式處理方式合并文件,避免內存占用過大。

3. 服務器配置檢查

雖然fcgidmaxrequestlen并非直接原因,但仍需檢查并適當調整服務器配置,確保其不會成為瓶頸。

其他建議

選擇可靠的技術文檔和資源,避免依賴不準確的信息。

通過以上優化,可以有效解決視頻切片上傳的48MB限制問題,確保大文件上傳的穩定性。

? 版權聲明
THE END
喜歡就支持一下吧
點贊9 分享