【问题标题】:Error when downloading a file with Meteor from Github assets API使用 Meteor 从 Github assets API 下载文件时出错
【发布时间】:2016-06-28 20:05:08
【问题描述】:

我在 Meteor 应用程序中遇到了一个错误。我要做的是从 github 获取发布资产文件,然后解压缩。我可以从标准浏览器下载它。

我的 Meteor 请求的结果包含一个缓冲区,如果我愿意,我可以将其保存为二进制文件,但与我从浏览器获得的二进制文件不同(我比较了每个文件的十六进制代码,并且即使大小不同)。

当我试图打开通过 Meteor(使用 windows zip 程序或使用 JSZip)下载的存档文件时,它告诉我文件已损坏。

这是我用来下载文件的代码:

HTTP.call('GET',asset.url,{ // asset.url is a valid one
    params:{
        'access_token':token
    },
    headers: {
        'Accept':"application/octet-stream",
        'User-Agent':"My app",
    }
},function( error, result ) {
    if(error)console.log(error);
    else{
        console.log('file downloaded !');
        var app_archive = new JSZip(); // I'm using JSZip for decompressing the stream
        app_archive.load(new Buffer(result)); // fail here
        package_file = app_archive.file('package.json');
        console.log(package_file);
    }
});

这是 Meteor 控制台输出:

=> Meteor server restarted
I20160313-16:56:43.975(-5)? file created !
I20160313-16:56:44.105(-5)? Exception in callback of async function: Error: Corr
upted zip : can't find end of central directory
I20160313-16:56:44.106(-5)?     at Object.ZipEntries.readEndOfCentral (C:\Users\
jimmy\AppData\Local\.meteor\packages\udondan_jszip\2.4.0_1\npm\node_modules\jszi
p\lib\zipEntries.js:135:19)
I20160313-16:56:44.108(-5)?     at Object.ZipEntries.load (C:\Users\jimmy\AppDat
a\Local\.meteor\packages\udondan_jszip\2.4.0_1\npm\node_modules\jszip\lib\zipEnt
ries.js:197:14)
I20160313-16:56:44.114(-5)?     at Object.ZipEntries (C:\Users\jimmy\AppData\Loc
al\.meteor\packages\udondan_jszip\2.4.0_1\npm\node_modules\jszip\lib\zipEntries.
js:21:14)
I20160313-16:56:44.116(-5)?     at Object.module.exports [as load] (C:\Users\jim
my\AppData\Local\.meteor\packages\udondan_jszip\2.4.0_1\npm\node_modules\jszip\l
ib\load.js:11:18)
I20160313-16:56:44.117(-5)?     at server/FabMo-App-Store.js:122:19
I20160313-16:56:44.119(-5)?     at runWithEnvironment (packages/meteor/dynamics_
nodejs.js:110:1)

我认为这可能与编码问题有关,但我尝试了几乎所有编码格式都没有成功。我愿意接受任何建议。

【问题讨论】:

    标签: node.js http meteor github-api jszip


    【解决方案1】:

    你是对的,这是一个编码问题。从documentation,您可以在结果中以字符串形式获得 HTTP 响应的正文。要将内容作为字符串获取,您/浏览器/框架将需要使用其编码(通常为 UTF8)从其二进制形式对其进行解码。您尝试获取一个 binary 文件,“解码”它会损坏它。

    您需要以二进制格式获取结果。问题#1670 看起来很有希望,但没有合并。使用meteor add http aldeed:http,我得到了

    HTTP.call('GET',asset.url,{
      params:{
        responseType: "arraybuffer"
        // ...
      },
      // ...
    },function( error, result ) {
        var app_archive = new JSZip();
        app_archive.load(result); // result is an ArrayBuffer
    });
    

    【讨论】:

      【解决方案2】:

      终于用request包让它工作了

      代码如下:

      request({
        method : "GET",
        url : asset.url,
        headers:{
          'Accept':"application/octet-stream",
          'User-Agent':"My App",
          'token':token
        },
        encoding: null // <- this one is important !
      }, function (error, response, body) {
        if(error ||  response.statusCode !== 200) {
          // handle error
        }
      
        var app_archive = new JSZip();
        app_archive.load(body);
        package_file = app_archive.file('package.json').asText();
        console.log(package_file);
      });
      

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2016-10-07
        • 2017-04-07
        • 2014-01-24
        • 2015-12-23
        • 1970-01-01
        • 2015-09-17
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多