文件上传对于超大文件启用分块上传, 避免413错误以及失败时无需从头开始
Please make sure of the following things
- [X] I have read the documentation.
- [X] I'm sure there are no duplicate issues or discussions.
- [X] I'm sure this feature is not implemented.
- [X] I'm sure it's a reasonable and popular requirement.
Description of the feature / 需求描述
由于cloudflare的免费版限制, 对于上传文件超过100M会直接在上传完后拦截, 直接报413错误, 而且大文件一旦中间出错了, 还要从头上传, 希望支持文件分块上传来解决问题
Suggested solution / 实现思路
前端在上传前提前分块, 多次提交上传请求, 再由后端整理好完整文件, 拼装起来, 对于挂载其他网盘可能无法这样做, 只在本地存储也好
Additional context / 附件
No response
This issue has been automatically marked as stale because it has not had recent activity. It will be closed if no further activity occurs. Thank you for your contributions.
最近配置了windows自带的webdav,发现支持的最大大小约 4G(32位表示的最大整数换算过来)。所以还是希望弄够配置分块,这样alist兼容性能更上一步。
提供一点实现思路(不太懂go, 但是思路都是一致的)
JavaScript 中, 上传使用 js 中 Blob 对象的 slice 方法完成对文件的分割(这里实际是浏览器对本地文件的引用)
将分割好的文件进行上传, 且在上传请求的请求头中包含关于当前分块, 总分块个数, 总文件大小
后端接收先判断是否为新文件, 新文件则先创建文件大小的文件, 然后使用文件指针在对应位置写入当前块信息
注意前端做好块上传失败重试, 并发写入时注意判断块是否写过了, 以及取消上传时删除对应文件
前端简单的示例代码
// html
<input type="file" id="file-upload">
// js
function handleFileUpload(event) {
const file = event.target.files[0];
const chunkSize = 1024 * 1024; // 1MB
let chunks = 0;
let chunkStart = 0
while (chunkStart < file.size) {
uploadChunk(file.size, chunks, file.slice(chunkStart, chunkStart + chunkSize));
chunks += 1;
chunkStart=chunks*chunkSize
}
}
async function uploadChunk(fileSize, chunks, chunk, retries = 3) {
const formData = new FormData();
formData.append('file', chunk);
try {
await fetch('/upload-endpoint', {
method: 'POST',
headers: {
fileSize,
chunks,
},
body: formData,
});
} catch (error) {
if (retries > 0) {
await uploadChunk(fileSize, chunks, chunk, retries - 1);
} else {
console.error('Failed to upload chunk: ', error);
}
}
}
大神的思路都很赞,国内网盘大部分都有单文件4G的上传限制,但是我也是有大文件需要备份上传,甚至超过100g,现在还只能用物理备份。
大神的思路都很赞,国内网盘大部分都有单文件4G的上传限制,但是我也是有大文件需要备份上传,甚至超过100g,现在还只能用物理备份。
对接国内云网盘的话, 倒是可以拆分存储来解决, 就是这样没法直接在国内云网盘操作文件, 需要都下载下来手动合并, 出意外的概率就增加了
赞同,docker目前还没更新这个功能,坐等更新
不应该在前端分割,这样只有web才能用。思路应该是后端传api出来。然后识别到分段参数 (比如默认50mb 或者自定义10mb 100mb) 就会生成多个上传url分段上传然后后端合并再转云盘(或者直接重定向到各家云盘用他们的分段api?这个应该不现实,应该不会都有这种api而且公开,适配也复杂。先存后端不知道是不是现在上传的做法还是直接重定向,还没看源码,不知道会不会因为服务器空间不够而上传失败)
通过api,也能自己写第三方应用上传alist,因为除了alist本身,有前端界面的比较少。当然也可以两个方案 web上用前后端配合 api文档里提供纯后端,这样开发任务太重了,感觉也没必要。
看作者可能短期不会实现,需要有人pr,可惜我也不太懂编程只是看得懂不会写。只能提供一个思路也不知道准不准确。不过思路是这样,需求也不着急。希望不会打扰各位。
折腾了两个小时才发现是 cloudflare 的锅,期待一下进展👂
@xhofe 请问是否可以把这个任务分配给我?
@xhofe 请问是否可以把这个任务分配给我?
我觉得你直接提PR就行了😊当然你也可以说一声,把这个issue assign给你
@xhofe 请问是否可以把这个任务分配给我?
我觉得你直接提PR就行了😊当然你也可以说一声,把这个issue assign给你
欢迎 assign 给我,我来看看