使用 Meteor 从 Github 资产 API 下载文件时出错
Error when downloading a file with Meteor from Github assets API
我的 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.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.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.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.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)
我觉得可能是编码问题,但是我几乎尝试了所有编码格式都没有成功。我愿意接受任何建议。
没错,这是一个编码问题。从 documentation,您可以在结果中得到 HTTP 响应正文作为字符串。要将内容作为字符串获取,you/the browser/the 框架需要使用其编码(通常为 UTF8)从二进制形式对其进行解码。您尝试获取 binary 文件,"decoding" 它会损坏它。
您需要以二进制格式获取结果。问题 #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
});
终于通过使用 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);
});
我的 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.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.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.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.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)
我觉得可能是编码问题,但是我几乎尝试了所有编码格式都没有成功。我愿意接受任何建议。
没错,这是一个编码问题。从 documentation,您可以在结果中得到 HTTP 响应正文作为字符串。要将内容作为字符串获取,you/the browser/the 框架需要使用其编码(通常为 UTF8)从二进制形式对其进行解码。您尝试获取 binary 文件,"decoding" 它会损坏它。
您需要以二进制格式获取结果。问题 #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
});
终于通过使用 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);
});