将二进制数据发送到Amazon S3(Javascript)

3

当我将二进制数据写入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 );
      }
    } );
  }
} );

当原始的png_file85时,返回105。 S3以某种方式修改了我的文件,我认为这与字符集有关。

如果取消注释Content-Length行,则在putObject()上会出现400错误:The Content-MD5 you specified did not match what we received

如果我使用ContentMD5:crypto.createHash("md5").update(png_file).digest("base64")计算MD5哈希值(而不是让S3库执行它),则会得到相同的结果。这似乎确认了我发送的数据与S3接收到的数据之间的差异。

我阅读了一个类似标题的问题,但没有解决问题。

2个回答

5

S3 putObject() 假定传入的参数是 Buffer 或 UTF-8 字符串。我应该将二进制数据以它本来的形式发送,而不是作为 "binary string" 发送,意思是使用 new Buffer(...) 而不是 new Buffer(...).toString("binary")


1

看起来S3实际上不太可能修改您正在上传的内容。更可能的是,在下载时被错误地解释,因为这对于png来说似乎无效:

ContentType: "text/data;charset=utf-8", 

这不适用于png格式的文件。我建议您使用以下内容:

ContentType: "image/png", 

抱歉,这是我的笔误。我已经更新了原始问题。添加或不添加;charset=utf-8都不会修改输出结果。 - ehmicky
2
@ehmicky 感谢您接受我的答案,但我不认为我真正为您解决了问题——我只是发现了一个笔误,而您似乎已经找到了真正的问题并解决了它。在这种情况下,接受您自己的答案是可以的,特别是在您确实自己解决了问题且其他答案都没有提供实际解决方案的情况下。您可以通过再次点击复选框来“取消接受”我的答案。 - Michael - sqlbot

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接