简体   繁体   中英

Write file to directory then zip directory

I am trying to write a file to a directory templates then stream a zip with the content that was written. However, the when the zip file is returned it says Failed - Network Error which is due to the fs.writeFile in the controller. If i remove the WriteFile stream then the zipping works fine. My question is how do i first write the file then run the zip. There seems to be something synchronous happening with the archiving and file writing of typeArrayString .

Controller:

exports.download_one_feed = function(req, res, next) {
  Feed.findOne({'name': req.params.id})
  .exec(function(err, dbfeeds){
    if(err){
      res.send('get error has occured in routes/feeds.js');
    } else {
      const feedArray = dbfeeds.feed.data;

      // write file
      // get from db collection & write file to download
      const typeArrayString = JSON.stringify(feedArray);

      let type = 'b'; // test only

      fs.writeFile(path.join(appDir, 'templates/' + type + '/template.json'), typeArrayString, (err) => {
        if (err) throw err;
        console.log('Saved!');
      })
      archiverService.FileArchiver(feedArray, res);
    }
  })
};

Archive Service

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 (feedArray, res) {
    // const app = this.app;
    const uploadsDir = path.join(appDir, '/uploads/');
    const templatesDir = path.join(appDir, '/templates/');
    const extensions = [".jpg", ".png", ".svg"];
    let imageArray = [];

    const feedArrayObject = JSON.parse(feedArrayString);

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

    // 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('download.zip');
    zip.pipe(res);
    // zip template directory
    console.log(templatesDir)
    zip.directory(templatesDir, false);
    zip.on('error', (err) => { throw err; });

    zip.finalize();

    return this;
  }

我没有写文件然后压缩目录,而是使用zip.append覆盖目录中的旧文件。

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM