【问题标题】:How to fetch the image files from a server and zip it in sailsjs如何从服务器获取图像文件并将其压缩到sailsjs
【发布时间】:2019-04-25 03:40:38
【问题描述】:

我想压缩来自 s3 url 的所有图像。我在sailsjs框架的服务器端做。

我尝试使用 axios 下载图像并使用“zipdir”。图像正在临时文件夹中下载。但它没有正确拉上拉链。

this.downloadFiles = function (req, res) {
    var resObj = {}
    async.waterfall([
        this.createFolder.bind(undefined, req),
        this.downloadFilesAxios.bind(undefined, req),
        this.zipTheFiles.bind(undefined, req)
    ], function final(err, result) {
        if (err) {
            console.log('SOME ERROR', err);
            resObj.statusCode = err.statusCode || 500;
        } else {
            resObj.statusCode = 200;
            resObj.result = result.questionList;
        }
        console.log('------', resObj.statusCode)
        resObj.messageKey = sails.config.statusCode[resObj.statusCode].key;
        resObj.message = sails.config.statusCode[resObj.statusCode].message;
        return res.send(resObj);
    });
};



}

this.downloadFilesAxios = function (req, obj, callback) {
    SurveyDocs.find({ surveyId: req.body.surveyId })
        .exec(function (err, docsDetails) {
            async.map(docsDetails, function (img, cb) {
                const url = img.docS3Url;

                let imageName = img.docFileName;
                const path = Path.resolve(__dirname, "temp", imageName);
                const writer = Fs.createWriteStream(path)

                Axios({
                    method: 'get',
                    url: url,
                    responseType: 'stream'
                })
                    .then(function (response) {
                        response.data.pipe(writer)
                    })
                writer.on('finish', (done) => {
                    console.log('success!!!');
                    cb(null, null)
                });
                writer.on('error', (err) => {
                    console.log('failed!!!');
                    cb(err, null)
                });

            }, (err, data) => {
                if (err) {
                    console.log('errrr', err);
                }
                callback(null, obj);
            });
        })
};

this.zipTheFiles = function (req, obj, callback) {
    var surveyId = req.body.surveyId;
    var tempDir = 'assets/zip/' + surveyId + '.zip'
    zipdir('temp', { saveTo: tempDir }, function (err, buffer) {
        callback(null, obj);
    });
    callback(null, obj);
}

我收到一个损坏的 zip 文件。请提出解决方案。

【问题讨论】:

  • 我相信 WriteStream 的东西有问题。我模拟了相同的过程,它似乎对我有用。但在我的情况下,我没有使用写入流。

标签: javascript node.js sails.js


【解决方案1】:

我尝试了您的示例,您需要考虑一些事项才能使其正常工作。

const async = require('async');
const fs = require('fs');
const path = require('path');
const zipDir = require('zip-dir');
const axios = require('axios');
let writer;


async.waterfall([
  createFolder,
    downLoadFileAxios,
    zip

], function (err, result) {
  if (err) {
    console.log(err);
  } else {
    console.log('result :', result);
  }
});

假设此方法创建 temp 文件夹

function createFolder(callback) {
  setTimeout(function() {
    callback(null, 'temp');
  }, 1000);
}

这里的 writeStream 对象和它的事件应该放在 then 块中。以便它正确地将流写入文件。

这里的另一件重要的事情是你没有附加一个cath块来附加promise,所以如果发生任何异常,它就会被简单地吃掉。

function downLoadFileAxios(dirPath, callback) {
  // Hard coded the images url for the sake of simplicity
  let files = [
    'https://free-images.com/lg/be5e/climbing_helmets_climbing_equipment.jpg',
    'https://free-images.com/lg/87ce/lilac_lilac_bush_lilac.jpg'
  ];

  async.mapSeries(files, function(img, cb) {
    let name = img.slice(img.lastIndexOf('/') + 1);
    let imagePath = path.resolve(__dirname, "newDir", name);
    writer = fs.createWriteStream(imagePath);
    axios({
      method: 'get',
      url: img,
      responseType: 'stream'
    }).
    then(function(response) {
      response.data.pipe(writer);
      writer.on('finish', (done) => {
        console.log('success!!!');
          cb(null, null)
      });
      writer.on('error', (err) => {
          console.log('failed!!!');
          cb(err, null)
      });
    })
    .catch((err) => {
      console.log(err);
    })
  }, function(err, result) {
    if (err) {
      console.log('errrr', err);
    }
    callback(null, 'done downloading');
  })

}


function zip (dirPath, callback) {
  let zipPath = path.resolve(__dirname, "assets", "file.zip");
  // console.log(`got directory path : ${dirPath}`);

  zipDir("newDir", {
    saveTo: zipPath
  }, function(err, buffer) {
      if(err) {
        callback(err, null);
      } else {
        callback(null, 'done');
      }
  });
}

这可以使用 Async/Await 轻松完成,如下所示。

const async = require('async');
const fs = require('fs');
const path = require('path');
const zipDir = require('zip-dir');
const axios = require('axios');
var writer;

// faking the directory creation part
async function createFolder(callback) {
 return new Promise((resolve, reject) => {
  setTimeout(() => {
    resolve(true);
  }, 2000);
 });
}

//Executes in the specified order.
(async () => {
  await createFolder();
  await downLoadFile();
  await zipTheFile();
})();

async function downLoadFile() {

  let files = [
    'https://free-images.com/lg/be5e/climbing_helmets_climbing_equipment.jpg',
    'https://free-images.com/lg/87ce/lilac_lilac_bush_lilac.jpg'
  ];

  for(let i= 0; i<files.length; i++) {
    await downLoadFileAxios(files[i]);
  }
}

async function downLoadFileAxios(url) {
  let name = url.slice(url.lastIndexOf('/') + 1);
  let imagePath = path.resolve(__dirname, "newDir", name);
  let writer = fs.createWriteStream(imagePath);

  const response = await axios({
    url,
    method: 'GET',
    responseType: 'stream'
  })

  response.data.pipe(writer)

  return new Promise((resolve, reject) => {
    writer.on('finish', resolve)
    writer.on('error', reject)
  })
}

function zipTheFile () {
  let zipPath = path.resolve(__dirname, "assets", "file.zip");
  return new Promise((resolve, reject) => {
    zipDir("newDir", {
      saveTo: zipPath
    }, function(err, buffer) {
        if(err) {
          return reject(err);
        }
        return resolve('done');
    });
  })
}

希望这会有所帮助!

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2019-05-30
    • 2017-08-21
    • 2014-02-13
    • 2015-11-24
    • 2018-03-29
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多