我正在使用 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);
它导致从 S3返回以下错误:
指定的 Content-MD5无效。
我做错了什么?
感谢你们的帮助!
P.S. 我使用的是 Google App Engine-我无法将文件写入磁盘或 创建临时文件,因为 AppEngine 不支持 FileOutputStream。