Mik*_* B. 7 javascript data-transfer download chunking node.js
我想从我的应用程序使用 Node.js 和 Express.js 运行的同一服务器(没有外部云文件存储,也就是本地)实现一个大文件下载(大约 10-1024 Mb)。
我想通了如何将整个文件转换为做到这一点Blob,通过网络传输,然后生成一个下载链接window.URL.createObjectURL(…)的Blob。只要文件很小,这种方法就可以完美地工作,否则不可能将整个文件保存在Blob服务器或客户端的 RAM 中。
我尝试使用File API和AJAX实现其他几种方法,但看起来 Chrome 将整个文件加载到 RAM 中,然后才将其转储到磁盘。同样,对于小文件可能没问题,但对于大文件则不是一种选择。
我的最后一次尝试是发送一个基本的请求Get:
const aTag = document.createElement("a");
aTag.href = `/downloadDocument?fileUUID=${fileName}`;
aTag.download = fileName;
aTag.click();
Run Code Online (Sandbox Code Playgroud)
在服务器端:
应用程序.mjs
app.get("/downloadDocument", async (req, res) => {
req.headers.range = "bytes=0";
const [urlPrefix, fileUUID] = req.url.split("/downloadDocument?fileUUID=");
const downloadResult = await StorageDriver.fileDownload(fileUUID, req, res);
});
Run Code Online (Sandbox Code Playgroud)
存储驱动程序
export const fileDownload = async function fileDownload(fileUUID, req, res) {
//e.g. C:\Users\User\Projects\POC\assets\wanted_file.pdf
const assetsPath = _resolveAbsoluteAssetsPath(fileUUID);
const options = {
dotfiles: "deny",
headers: {
"Content-Disposition": "form-data; name=\"files\"",
"Content-Type": "application/pdf",
"x-sent": true,
"x-timestamp": Date.now()
}
};
res.sendFile(assetsPath, options, (err) => {
if (err) {
console.log(err);
} else {
console.log("Sent");
}
});
};
Run Code Online (Sandbox Code Playgroud)
当我点击链接时,Chrome 会在下载中显示该文件,但状态为Failed - No file。下载目的地中没有文件出现。
我的问题:
Get-request 的情况下我会失败 - 没有文件?res.sendFile对于小文件来说,可能是一个正确的选择,但对于大文件,最好使用res.write,它可以分成块。是否可以res.write与Get-request一起使用?PS我已经详细说明了这个问题,以使其更加狭窄和清晰。以前这个问题主要是从 Dropbox 下载一个大文件而不将它存储在 RAM 中,可以找到答案: 如何使用 Node.js 从 Dropbox 下载一个大文件?
Chrome 无法有效显示下载进度,因为文件正在后台下载。下载完成后,会创建一个指向该文件的链接,并“单击”以提示 Chrome 显示已下载文件的对话框。
这可以更容易地完成。您需要创建一个GET请求并让浏览器下载文件。
app.get("/download", async (req, res, next) => {
const { fileName } = req.query;
const downloadResult = await StorageDriver.fileDownload(fileName);
res.set('Content-Type', 'application/pdf');
res.send(downloadResult.fileBinary);
});
Run Code Online (Sandbox Code Playgroud)
function fileDownload(fileName) {
const a = document.createElement("a");
a.href = `/download?fileName=${fileName}`;
a.download = fileName;
a.click();
}
Run Code Online (Sandbox Code Playgroud)
| 归档时间: |
|
| 查看次数: |
515 次 |
| 最近记录: |