Не удается скачать файл с помощью Axios
Пишу проект в котором должна быть функциональность скачивания файлов, пытаюсь скачать файл с сервера (NodeJS) с помощью Axios:
async download(id) {
const query = Array.isArray(id) ? id.join('~') : id
try {
const res = await axios.get(`/api/files/download?files=${query}`, { responseType: 'blob' })
const downloadUrl = window.URL.createObjectURL(new Blob([res.data]))
const fileName = res.headers['x-file-name']
const link = document.createElement('a')
link.href = downloadUrl
link.download = decodeURI(fileName)
document.body.appendChild(link)
link.click()
link.remove()
} catch(e) {
console.log(e.message)
}
}
Но с файлами, которые больше определенного размера, возникает ошибка:
При этом, если я пытаюсь скачать один файл, на стороне сервере запрос выглядит как успешный.
А когда пытаюсь скачать несколько (сервер возвращает их архивом), то возникает ошибка на стороне сервера:
Error: Request aborted at onaborted (/home/user/Projects/MERN-test-storage/server/node_modules/express/lib/response.js:1025:15) at Immediate._onImmediate (/home/user/Projects/MERN-test-storage/server/node_modules/express/lib/response.js:1067:9) at processImmediate (internal/timers.js:464:21) { code: 'ECONNABORTED' }
Ошибка в консоли при скачивании нескольких файлов:
Обработчик запроса на сервере:
async download(req, res) {
if(!req.query.files) return res.status(400).send('empty query')
try {
const ids = req.query.files.split('~')
const files = await File.find({_id: { $in: ids }}, {name: 1, _id: 0})
const fileNames = files.map(f => f.name)
const paths = fileNames.map(name => path.resolve(path.resolve(), 'uploads', name))
paths.forEach(p => { if(!fs.existsSync(p)) throw new Error('file not found') })
if(paths.length === 1) {
const fileName = encodeURI(fileNames[0])
res.set('x-file-name', fileName)
res.download(paths[0])
} else {
const archiveName = `Archive-${Date.now()}.zip`
const archivePath = `${path.resolve('uploads')}/${archiveName}`
const output = fs.createWriteStream(archivePath)
const archive = archiver('zip', {
zlib: { level: 1 }
})
archive.pipe(output)
paths.forEach((p, idx) => {
archive.append(fs.createReadStream(p), { name: fileNames[idx] })
})
archive.finalize()
output.on('close', () => {
res.set('x-file-name', archiveName)
res.download(archivePath, (e) => {
if(e) console.log('download error', e)
fs.unlink(archivePath, (e) => e && console.log(e))
})
})
}
} catch(e) {
console.log(e.message)
return res.status(404).json('file not found')
}
}