簡體   English   中英

Knox S3上傳損壞或被截斷的文件

[英]knox S3 upload corrupted or truncated file

這是我真正知道答案的腦筋急轉彎問題。 我對此懸賞,因為它代表了寶貴的Node編程安全性提示(這是第一個提示)。

  • 提示2:在HTTP請求中,“ Content-Length”標頭字段的單位是什么?

我正在使用

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.writereq.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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM