Amazon S3 将我的二进制数据解释为非 UTF-8 并在我写入存储桶时对其进行修改。
使用官方 s3 Javascript 客户端的示例:
var png_file = new Buffer( "iVBORw0KGgoAAAANSUhEUgAAAAUAAAAFCAYAAACNbyblAAAAHElEQVQI12P4//8/w38GIAXDIBKE0DHxgljNBAAO9TXL0Y4OHwAAAABJRU5ErkJggg==", "base64" ).toString( "binary" );
s3.putObject( {
Bucket: bucket,
Key: prefix + file,
ContentType: "image/png;charset=utf-8",
CacheControl: "public, max-age=31536000",
Body: png_file
// , ContentLength: png_file.length
}, function( e ){
if ( e ) {
console.log( e );
} else {
s3.getObject( {
Bucket: bucket,
Key: prefix + file
}, function( e, v ) {
if ( e ) {
console.log( e )
} else {
console.log( v.ContentLength );
}
} );
}
} );
返回 105
而原始 png_file
是 85
。 S3 以某种方式修改了我的文件,我认为这与字符集有关。
如果我取消注释 Content-Length
行,我会在 putObject()
上收到 400 错误:您指定的 Content-MD5 与我们指定的内容不匹配收到
。
如果我使用 ContentMD5 自己计算 MD5 哈希(而不是让 S3 库来计算),我会得到相同的结果:crypto.createHash("md5").update(png_file).digest("base64")
。这似乎承认我发送的数据和 S3 接收的数据之间存在差异。
我读过 similarly titled issue , 但并没有解决问题。
最佳答案
S3 putObject()
假定一个 Buffer 或一个 UTF-8 字符串。我应该按原样发送二进制文件,而不是作为“二进制字符串”发送,这意味着使用 new Buffer(...)
而不是 new Buffer(...).toString("binary ")
.
关于javascript - 将二进制数据发送到 Amazon S3 (Javascript),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26805005/