2016-03-13 45 views
1

我在我的Meteor應用程序中遇到了一個錯誤。我想要做的是從github獲得一個版本資產文件,並將其解壓縮。我能夠從標準瀏覽器下載它。從Github資產下載Meteor文件時出錯API

我的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 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) 

我認爲這可能與編碼的問題,但我嘗試幾乎所有編碼格式都沒有成功。我願意接受任何建議。

回答

0

終於成功了使用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); 
}); 
0

你說得對,這是一個編碼問題。從documentation開始,您將HTTP響應的主體作爲字符串得到。要將內容作爲字符串獲取,您的瀏覽器/框架將需要使用其編碼(通常爲UTF8)從其二進制形式對其進行解碼。你試圖得到一個二進制文件,「解碼」它會破壞它。

您需要以二進制格式獲得結果。問題#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 
}); 
+0

它沒有工作,apearred的其他錯誤信息:「意外文件結尾「... – jlucidar

相關問題