Я загружаю файл на S3 с помощью Java - это то, что я получил до сих пор:
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:
Указанный вами контент-MD5 недействителен.
Что я делаю неправильно?
Любая помощь оценивается!
PS Я нахожусь в Google App Engine - я не могу записать файл на диск или создать временный файл, потому что AppEngine не поддерживает FileOutputStream.