Так что мой заголовок, вероятно, не имеет особого смысла, поэтому позвольте мне объяснить, я использую экспресс с mongoose / MongoDB для загрузки / выгрузки файлов, прежде чем я смог просто перейти к URL-адресу браузера и обработать запрос на получение файла, подобный этому. , но я хотел добавить аутентификацию, и, поскольку мне нужно отправить токен JWT через заголовок, я не могу просто перейти по URL через браузер, позвольте мне показать вам, что у меня есть.
router.get('/file-service/download', auth, async (req, res) => {
if (!req.user) {
return res.status(401).send('Please authenticate');
}
try {
const tempID = '5dc5f57a081263451cee80d4';
const gfs = Grid(conn.db);
gfs.findOne({ _id: tempID }, (err, file) => {
//console.log("file", file);
if (err) {
return res.status(500).send(err);
}
res.set('Content-Type', file.contentType);
res.set('Content-Disposition', 'attachment; filename="' + file.filename + '"');
const readStream = gfs.createReadStream({
_id: tempID
});
//console.log("grid", readStream);
readStream.pipe(res);
});
} catch (e) {
console.log(e);
res.status(500).send(e);
}
});
Так что я использую для перехода на localhost: 3000 / file-service / download, и он просто запускает загрузку в chrome, с собственным менеджером загрузок, и показывает прогресс, все, что вы ожидаетепри загрузке файла, но теперь это невозможно, поэтому вместо этого я выполняю запрос axios
, как показано ниже.
const config = {
responseType: 'arraybuffer',
headers: { Authorization: 'Bearer ' + 'jwtsecret' }
};
console.log('fetching download');
axios
.get('http://' + currentURL + '/file-service/download', config)
.then(response => {
let blob = new Blob([response.data], { type: 'binary/octet-stream' });
let link = document.createElement('a');
link.href = window.URL.createObjectURL(blob);
link.download = 'zip_test.zip';
link.click();
})
.catch(err => {
console.log(err);
});
И это работает, НО, он должен сначала загрузить весь файл в память, например, я проверял это с файлом 500 МБ, после того, как я выполняю запрос axios
, он принимает как15+ секунд, чтобы он извлек все данные, затем он предлагает использовать их для загрузки и почти мгновенно завершает работу. Но если я удалю аутентификацию и сделаю это только через браузер через URL, загрузка начнется мгновенно и покажет прогресс загрузки хрома, как обычно. Есть ли способ достичь такой же функциональности загрузки / потоковой передачи с axios
? Или есть какой-нибудь способ отправить токен без axios
, чтобы я мог вообще его избежать и просто сделать это обычным способом?