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

Sending binary data to Amazon S3 (Javascript)

本文关键字:AmazonS3 Javascript 二进制 数据      更新时间:2023-09-26

AmazonS3将我的二进制数据解释为非UTF-8,并在写入bucket时对其进行修改。

使用官方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_file85。S3以某种方式修改了我的文件,我认为这与字符集有关。

如果我取消对Content-Length行的注释,我会在putObject():The Content-MD5 you specified did not match what we received上得到一个400错误。

如果我自己用ContentMD5: crypto.createHash("md5").update(png_file).digest("base64")计算MD5散列(而不是让S3库来计算),我会得到同样的结果。这似乎承认了我发送的数据和S3接收的数据之间的差异。

我读过一期类似标题的文章,但它并没有解决问题。

S3 putObject()采用Buffer或UTF-8字符串。我应该按原样发送二进制文件,而不是"二进制字符串",这意味着使用new Buffer(...)而不是new Buffer(...).toString("binary")

S3似乎不太可能真正修改您正在上传的内容。它似乎不太可能在下载时被错误地解释,因为这似乎对png:无效

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

这对于png文件来说是不正确的。我建议这就是你想要的:

ContentType: "image/png",