Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/javascript/393.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/node.js/42.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Javascript 创建并发送Zip文件-节点JS_Javascript_Node.js_Post_Zip - Fatal编程技术网

Javascript 创建并发送Zip文件-节点JS

Javascript 创建并发送Zip文件-节点JS,javascript,node.js,post,zip,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!')

我正在尝试创建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或archiver(我通常只使用内置的zlib模块),但我马上注意到一件事,您应该将
    res.download
    放在
    writeFile
    的回调中。这样,只有在文件完全写入磁盘后,它才会发送该文件

    fs.writeFile('test1.zip', zip.generate(options), 'binary', function (error) {
        res.download('test1.zip');
    });
    
    我希望这个解决方案对您有效,如果您不愿意发表评论的话

    另外,我认为
    res.download
    可以为您设置内容处置头,您不需要手动设置。但不是100%确定。

    尝试使用此express easy zip软件包从本地文件夹路径生成zip文件,并将其作为下载文件发送到客户端

    var zip = require('express-easy-zip');
    var app = require('express')();
    
    app.use(zip());
    
    app.get('my-route/zip', async function(req, res) {
        var dirPath = __dirname + "/uploads";
        await res.zip({
            files: [{
                path: dirPath,
                name: 'Package'
            }],
            filename: 'Package.zip'
        });
    });
    
    上述解决方案有效。(上述解决方案生成zip并将其作为响应数据发送到前端。为了使其可下载,以下代码将起作用)我正在使用。它压缩文件并从后端(节点)将数据发送到前端。但在前端,我得到的只是响应数据。在我的情况下,我希望用户能够下载服务器发送的zip文件。为了解决这个问题,我遵循以下方法。在我使用的浏览器中生成下载窗口(我们可以采用另一种方法,但我发现这很容易)

    前端

    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'}
    ])
    
    后端

    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'}
    ])
    

    该模块也可以正常工作:

    未在服务器中创建临时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);
    });
    

    它不起作用。我照你写的做了。但作为回应,我在浏览器控制台输出中得到了一些哑文本。您是否检查了文件
    test1.zip
    ,以查看它是否确实包含您希望它包含的内容?是的,它包含hello.txt。在浏览器控制台输出中,我可以看到hello.txt和一些哑文本。我试图在本地进行,这可能会产生一些影响?请稍候,您正在下载文件,但正在浏览器控制台中检查?我不确定我是否明白你的意思。下载这样的文件时,您需要将文件保存到硬盘上。如果您只想向浏览器发送数据,则应改用
    res.send
    。您是否可以编辑您的原始帖子,并解释一下您试图实现的目标,以及您希望如何处理发送给客户的数据?是的,我希望在通过post发送一些数据后下载硬盘上的文件。我做了你写的所有事情,但下载没有开始。忘了控制台输出没关系。嗨@PtDf,你找到解决方案了吗?我也陷入了这样的境地。我无法下载zip文件。如果你解决了,请告诉我。感谢您提供这段代码片段,它可能会提供一些有限的、即时的帮助。通过展示为什么这是一个很好的问题解决方案,A将极大地提高它的长期价值,并将使它对未来有其他类似问题的读者更有用。请在你的回答中添加一些解释,包括你所做的假设。这对我来说是更好的解决方案。如果您不想使用express easy zipHello获得子文件夹,那么这个解决方案对我来说也比较好,但是前面的子文件夹如何呢?thanks@ALFA您只需浏览到“/zipFilesAndSend”路径,文件将在browser@golimar,我的案例已发布,无法获取:)。我使用如下内容:。然后(response=>response.arrayBuffer())并尝试下载响应buffer@golimar我用下载的JS就得到了解决方案,谢谢