zip文件已附加但未在客户端下载

时间:2018-03-21 20:54:46

标签: javascript node.js reactjs express

我正在尝试在我的MERN应用程序中下载一个zip文件。我在响应中获取文件,客户端如何不下载实际文件。我正在使用archiver来压缩文件,然后在提取调用中返回它们。

档案服务:

const archiver = require('archiver')
const zip = archiver('zip')
const path = require('path')
const fs = require('fs')
const appDir = path.dirname(require.main.filename)

exports.FileArchiver = function (feed, res) {
    // const app = this.app;
    const uploadsDir = path.join(appDir, '/uploads/');
    const templatesDir = path.join(appDir, '/templates/');
    const feedArray = feed.feed.data;

    const extensions = [".jpg", ".png", ".svg"];
    const feedArrayString = JSON.stringify(feedArray);
    const feedArrayObject = JSON.parse(feedArrayString);
    let imageArray = [];
    let templateType = 'b'; //test

    // grab image names from object
    feedArrayObject.forEach(function(x){iterate(x)});
    // remove duplicates
    imageArray = uniq_fast(imageArray);

    // zip images
    for (let i = 0; i < imageArray.length; i++) {
      console.log(imageArray[i])
      const filePath = path.join(uploadsDir, imageArray[i]);
      zip.append(fs.createReadStream(filePath), { name: 'images/'+imageArray[i] });
    }

    res.attachment(feed.name + '.zip');
    zip.pipe(res);

    zip.append(feedArrayString, { name: 'feed.json' })
    zip.directory(templatesDir + '/' + templateType, false);

    zip.on('error', (err) => { throw err; });
    zip.on('warning', (err) => {
      if (err.code === 'ENOENT') {
        console.log('ENOENT for archive')
      } else {
        throw err;
      }
    });

    zip.finalize();

    return this;
 }

客户端获取:

export const downloadData = (url, _id, name, type) => {
  return fetch(url, {method: 'GET'})
  .then((res) => {
    console.log(res);
    return res;
  })
}

客户端标题附件:

content-disposition: attachment; filename="a_gpo.zip"
content-type: application/zip

网络请求响应返回200状态,我还可以看到客户端中的附件响应包含zip文件行话。但是,客户端不会返回实际的文件下载。

1 个答案:

答案 0 :(得分:0)

尝试将浏览器位置重定向到网址

export const downloadData = (url) => {
    window.location = url;
}