突破視頻切片上傳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