我正在尝试创建然后将zip文件发送到客户端。我知道如何创建它,但我有一个问题,发送给客户端。我尝试了很多方法。 我正在从客户端发送POST请求,作为响应,我想发送一个文件。 这是我的服务器站点示例代码
var Zip = require('node-zip');
router.post('/generator', function(req, res, next) {
var zip = new Zip;
zip.file('hello.txt', 'Hello, World!');
var options = {base64: false, compression:'DEFLATE'};
fs.writeFile('test1.zip', zip.generate(options), 'binary', function (error) {
console.log('wrote test1.zip', error);
});
res.setHeader('Content-disposition', 'attachment; filename=test1.zip');
res.download('test1.zip');
}
}); 我也试过这样的事情:
res.setHeader('Content-disposition', 'attachment; filename=' + filename);
res.setHeader('Content-type', mimetype);
var filestream = fs.createReadStream(file);
filestream.pipe(res);
我尝试使用这样的库:
node-zip
归档
有谁能解释我怎么做?
答案 0 :(得分:3)
之前我没有使用过node-zip或archiver(我通常只使用内置的zlib模块),但我立即注意到的一件事是你应该将res.download
置于writeFile
的回调中{1}}。这样,只有在文件完全写入磁盘后才会发送文件。
fs.writeFile('test1.zip', zip.generate(options), 'binary', function (error) {
res.download('test1.zip');
});
我希望这个解决方案适合你,如果它不随意发表评论。
另外,我认为res.download
为您设置Content-disposition标头,您无需手动设置它。虽然不是100%肯定。
答案 1 :(得分:0)
尝试使用这个express-easy-zip npm软件包来生成zip文件,并使用__dirname和文件夹名从本地路径获取该文件。返回生成的zip文件的res。
var zip = require('express-easy-zip');
const express = require('express');
var app = express();
app.get(serverbase+'zip',async function(req, res) {
var dirPath = __dirname + "/uploads";
await res.zip({
files: [
{ path: dirPath, name: 'Package' }
],
filename: 'Package.zip'
});
});
答案 2 :(得分:0)
以上解决方案有效。(以上解决方案生成zip并将其作为数据发送到前端作为响应。为了使其可下载,以下代码将起作用)我正在使用express-zip。它正在压缩文件并将数据从后端(节点)发送到前端。但是在前端,我只得到数据作为响应。在我的情况下,我希望用户能够下载服务器发送的zip。为了解决这个问题,我遵循以下方法。为了在浏览器中生成下载窗口,我使用了downloadjs(我们可以采用另一种方法,但是我觉得很简单)
前端
const download = require('downloadjs')
return axios({
url:process.env.API_HOST+'/getuploadedfiles',
method:'get',
headers:{
'Content-Type': 'multipart/form-data',
withCredentials:true,
},
responseType:'arraybuffer' // If we don't mention we can't get data in desired format
})
.then(async response => {
console.log("got al files in api ");
let blob = await new Blob([response.data], { type: 'application/zip' }) //It is optional
download(response.data,"attachement.zip","application/zip") //this is third party it will prompt download window in browser.
return response.data;
})
后端
const zip = require('express-zip');
app.use('/getuploadedfiles',function(req,res){
res.zip([
{path:'/path/to/file/file2.PNG',name:'bond.png'},
{path:'/path/to/file/file1.PNG',name:'james.png'}
])
答案 3 :(得分:0)
该模块也可以正常工作:https://www.npmjs.com/package/adm-zip
在服务器中未创建临时zip文件的示例:
var AdmZip = require('adm-zip');
router.get('/zipFilesAndSend', function(req, res) {
var zip = new AdmZip();
// add local file
zip.addLocalFile("./uploads/29/0046.xml");
// get everything as a buffer
var zipFileContents = zip.toBuffer();
const fileName = 'uploads.zip';
const fileType = 'application/zip';
res.writeHead(200, {
'Content-Disposition': `attachment; filename="${fileName}"`,
'Content-Type': fileType,
})
return res.end(zipFileContents);
});