AmazonS3 putObject使用InputStream长度示例

6 浏览
0 Comments

AmazonS3 putObject使用InputStream长度示例

我正在使用Java将文件上传到S3 - 目前已经有了以下代码:

AmazonS3 s3 = new AmazonS3Client(new BasicAWSCredentials("XX","YY"));
List buckets = s3.listBuckets();
s3.putObject(new PutObjectRequest(buckets.get(0).getName(), fileName, stream, new ObjectMetadata()));

文件正在上传,但是当我没有设置内容长度时会出现一个警告:

com.amazonaws.services.s3.AmazonS3Client putObject: 未指定流数据的内容长度。流内容将在内存中缓冲,并可能导致内存溢出错误。

我正在上传的是一个文件,stream变量是一个InputStream,可以通过以下方式获取字节数组:IOUtils.toByteArray(stream)

所以当我尝试设置内容长度和MD5(从这里获取)时,代码如下:

// 获取MD5的Base64哈希值
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);

这导致S3返回以下错误:

您指定的Content-MD5无效。

我做错了什么?

感谢任何帮助!

P.S. 我在Google App Engine上 - 我不能将文件写入磁盘或创建临时文件,因为AppEngine不支持FileOutputStream。

0