[英]knox S3 upload corrupted or truncated file
這是我真正知道答案的腦筋急轉彎問題。 我對此懸賞,因為它代表了寶貴的Node編程安全性提示(這是第一個提示)。
我正在使用
var knox = require('knox');
var s3 = knox.createClient({
key: ...,
secret: ...,
bucket: ...
});
// The bug is below:
var stringVal = JSON.stringify(<2d javascript array from a large spreadsheet>)
var req = s3.put(path + filename, {
'Content-Length': stringVal.length,
'Content-Type': 'application/json'
});
req.end(stringVal);
結果上傳被截斷或損壞。 我們有stringVal.length === 322889
,並且生成的S3項目大小與此匹配。 但是下載並重新加載文件會導致字符串長度為322140
。 在嘗試進行JSON解析之前,不會出現任何錯誤。解析該字符串(可預測)會導致語法錯誤。
這是怎么回事?
從knox
-module( https://github.com/LearnBoost/knox/blob/master/lib/client.js )的源代碼中,您可以了解到它使用了標准的http
-requests。
req.write
和req.end
默認情況下會從'utf8'轉換字符串( http://nodejs.org/api/http.html#http_request_end_data_encoding )。
因此,實際上發生的是,您無意中通過設置字符串長度而不是“ Content-Length”字段中的字節數來切斷字符串的末尾。 服務器將所有東西扔掉的時間更長; 因此,當您解析字符串時,會出現錯誤。
最快的解決辦法是:
'Content-Length': new Buffer(stringVal).length,
甚至更快:只需刪除“ Content-Length”行。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.