具有InputStream长度示例的AmazonS3 putObject

我正在使用Java将文件上传到S3-到目前为止,这是我得到的:

AmazonS3 s3 = new AmazonS3Client(new BasicAWSCredentials("XX","YY"));

List<Bucket> buckets = s3.listBuckets();

s3.putObject(new PutObjectRequest(buckets.get(0).getName(), fileName, stream, new ObjectMetadata()));

文件正在上传,但是未设置内容长度时会发出警告:

com.amazonaws.services.s3.AmazonS3Client putObject: No content length

specified for stream > data. Stream contents will be buffered in memory and

could result in out of memory errors.

这是我上传文件和stream变量是InputStream,从中我可以得到字节数组是这样的:IOUtils.toByteArray(stream)

因此,当我尝试像这样设置内容长度和MD5(从此处获取)时:

// get MD5 base64 hash

MessageDigest messageDigest = MessageDigest.getInstance("MD5");

messageDigest.reset();

messageDigest.update(IOUtils.toByteArray(stream));

byte[] resultByte = messageDigest.digest();

String hashtext = new String(Hex.encodeHex(resultByte));

ObjectMetadata meta = new ObjectMetadata();

meta.setContentLength(IOUtils.toByteArray(stream).length);

meta.setContentMD5(hashtext);

您指定的Content-MD5无效。

我究竟做错了什么?

任何帮助表示赞赏!

我在Google App Engine上-

无法将文件写入磁盘或创建临时文件,因为AppEngine不支持FileOutputStream。

回答:

因为从未回答过原始问题,而且我也遇到了同样的问题,所以针对MD5问题的解决方案是S3不需要我们通常考虑的十六进制编码的MD5字符串。

相反,我必须这样做。

// content is a passed in InputStream

byte[] resultByte = DigestUtils.md5(content);

String streamMD5 = new String(Base64.encodeBase64(resultByte));

metaData.setContentMD5(streamMD5);

本质上,他们想要MD5值的是Base64编码的原始MD5字节数组,而不是十六进制字符串。当我切换到此功能时,它开始对我非常有用。

以上是 具有InputStream长度示例的AmazonS3 putObject 的全部内容, 来源链接: utcz.com/qa/423174.html

回到顶部