I want to implement a big file downloading (approx. 10-1024 Mb). I've already succeeded to get a file from Dropbox:
operationResult = await dbx.filesDownload({
path: `/${CONFIG_STORAGE.uploader.assetsPath}/${fileUUID}`
});
Then I bundle the received file with a meta-data and I return it to my Node.js server:
fileMIME = mime.lookup(operationResult.name);
const downloadResult = Object.freeze({
fileBinary: operationResult.fileBinary,
fileLength: operationResult.fileBinary.length,
fileMIME,
fileName: operationResult.name,
isSucceeded,
message
});
return downloadResult;
Now I convert a Buffer
, I got from Dropbox, into a Readable
stream and pipe it back to a client:
res.setHeader("Content-Disposition", "attachment; filename=" + downloadResult.fileName);
res.setHeader("Content-Type", downloadResult.fileMIME);
const fileReadableStream = new Readable();
fileReadableStream.push(downloadResult.fileBinary);
fileReadableStream.push(null);
fileReadableStream.pipe(res);
Up until now everything is clear and works. Here I face a first pitfall: I need somehow to trigger a download process in browser.
In many examples, some small image or JSON are used, which we can completely load into RAM, make operations, e.g. transforming to Base64
, assign it to a.href
, and trigger a.click()
. But since my file is 10-50 Mb I'm not sure if such approach is a correct one.
I've already tried Fetch API:
const response = await fetch(`${host}/download?fileName=${fileName}`, {
credentials: "same-origin",
method: "POST",
mode: "cors"
});
const a = document.createElement("a");
a.href = response.text();
a.download = "MyFile.pdf";
a.click();
But I always get Failed - No file error. I also tried to use jQuery AJAX, and XMLHttpRequest
(XHR
), but still no file is downloaded.
Perhaps, there is something I'm missing. How to get a 10-1024 Mb file from a server?
P.S. I never thought that such a trivial task, as a file downloading, can be so complicated.