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

标签 javascript amazon-web-services amazon-s3 binary

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_file85。 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/

相关文章:

javascript - 如何将我的 fontawesome 图标放入 JavaScript 按钮中?

javascript - Asp.Net MVC 中 JS 和 CSS 的压缩

mongodb - 如何访问VPC外的mongodb实例

hadoop - 从 Internet 直接下载文件到我的 S3 存储桶

java - AWS SDK `PutObjectResult` 元数据是否没有保存内容长度值?

Javascript 不完整标签

java - 从 javascript、JSP 或 Java 运行 Phantomjs

java - Cognito SRP 身份验证 JAVA SDK

java - Amazon AWS 通过 Java API 创建 EBS(弹性 block 存储)

android - 如何在 android 应用程序中显示存储在 s3 中的所有类型的文档(.docx、.csv、.xls、.pdf、.txt)?