jszip+request 打包下载

发布于 2022-09-06 13:12:08 字数 1874 浏览 41 评论 0

项目需要打包下载文件,现在文件是保存在七牛上,打包下载,需要通过request请求文件,然后放入到jszip里面然后打包;现在遇到一个问题,如果多个文件,而且比较大,会出现只有一个文件可以正常下载下来,其它的文件只下载的部分,会报错:

 { 
    Error: read ECONNRESET
    at exports._errnoException (util.js:1022:11)
    at TCP.onread (net.js:610:25) code: 'ECONNRESET', errno: 'ECONNRESET', syscall: 'read' 
    }

代码如下:

'use strict';
const JSZip = require('jszip');
const request = require('request');
const fs = require('fs');
const path = require('path');
const sss = path.join(__dirname, 'me.zip');

const resultArr = [
  {
    fileName: 'charles-proxy-4.1.4.dmg',
    downLoadUrl: 'http://p2oryw9jc.bkt.clouddn.com/charles-proxy-4.1.4.dmg'
  },
  {
    fileName: 'googlechrome_mac_59.0.3071.109.dmg',
    downLoadUrl: 'http://p2oryw9jc.bkt.clouddn.com/googlechrome_mac_59.0.3071.109.dmg'
  }
];
const zip = new JSZip();
resultArr.map(item => {
  let inStream = request.get(item.downLoadUrl);
  let name = item.fileName;
  const inPaht = path.join(__dirname, item.fileName);
  let length = 0;
  inStream
    .on('response', function (response) {
      console.error(name + '--content-type--', response.headers); // 'image/png'
    })
    .on('data', function (data) {
      length += data.length;
    })
    .on('error', function (e) {
      console.error(name + '---error---->', e);
    })
    .on('end', function () {
      console.error(name + '---end---- length:'+ length);
    });
  zip.file(item.fileName, inStream);
});
const stream = zip.generateNodeStream({type: 'nodebuffer', streamFiles: true});
stream.pipe(fs.createWriteStream(sss));
stream
  .on('data', function (data, metadata) {
  })
  .on('error', function (e) {
    console.error('---error-----', e);
  })
  .on('end', function () {
    console.error('---end-----');
  });

请问这是什么问题造成呢?单独通过request下载文件没有问题,单独使用jszip打包本地文件也没有问题,这两个结合一起,就会出现这个问题

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(1

感性不性感 2022-09-13 13:12:08

经过调试,应该是

zip.file(item.fileName, inStream);

这个时候已经去请求文件了,但是jszip是依次来处理stream,如果处理一个stream的时间比较长的话,文件服务器会自动断开链接,所以最后打出来的zip包是不全的。

后来在https://github.com/archiverjs... 这个库的基础上,修改了它的代码,实现了一个

https://www.npmjs.com/package...

request请求只会在处理到他的时候,才会发起请求

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文