Как передать WriteStream, конкатенируя расширение?
Я новичок в NodeJS. Я знаю, что мы можем передавать данные клиенту с помощью метода pipe().
Вот фрагмент кода
router.get('/archive/*', function (req, res) {
var decodedURI = decodeURI(req.url);
var dirarr = decodedURI.split('/');
var dirpath = path.join(dir, dirarr.slice(2).join("/"));
console.log("dirpath: " + dirpath);
var archive = archiver('zip', {
zlib: {level: 9} // Sets the compression level.
});
archive.directory(dirpath, 'new-subdir');
archive.on('error', function (err) {
throw err;
});
archive.pipe(res)
archive.on('finish', function () {
console.log("finished zipping");
});
archive.finalize();
});
когда я использую запрос get, скачанный zip-файл без расширения. Я знаю это, потому что я передаю в ответ ответный поток. Есть ли в любом случае труба с расширением.zip? Или Как я могу отправить zip-файл без создания zip-файла на HDD?
2 ответа
Решение
Один из способов - поменять заголовки перед конвейером,
res.setHeader("Content-Type", "application/zip");
res.setHeader('Content-disposition' ,'attachment; filename=downlaod.zip');
Для данного кода,
router.get('/archive/*', function (req, res) {
var decodedURI = decodeURI(req.url);
var dirarr = decodedURI.split('/');
var dirpath = path.join(dir, dirarr.slice(2).join("/"));
var output = fs.createWriteStream(__dirname + '/7.zip');
var archive = archiver('zip', {
zlib: {level: 9} // Sets the compression level.
});
archive.directory(dirpath, 'new-subdir');
archive.on('error', function (err) {
throw err;
});
res.setHeader("Content-Type", "application/zip");
res.setHeader('Content-disposition' ,'attachment; filename=downlaod.zip');
archive.pipe(res);
archive.finalize();
});
Ты можешь использовать res.attachment()
чтобы установить имя файла загрузки, а также его MIME-тип:
router.get('/archive/*', function (req, res) {
res.attachment('archive.zip');
...
});