创建并发送Zip文件-NODE JS

时间:2015-10-21 13:34:45

标签: javascript node.js post zip

我正在尝试创建然后将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);

我尝试使用这样的库:

  1. node-zip

  2. 归档

  3. 有谁能解释我怎么做?

4 个答案:

答案 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);
});