AmazonS3 putObject with InputStream length example

Я загружаю файл на S3 с помощью Java - вот что я получил на данный момент:

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: Не указана длина содержимого для потока > данных. Содержимое потока будет буферизироваться в памяти и может привести к ошибке out of memory.

Это файл, который я загружаю, а переменная 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.

75
задан Community 23 May 2017 в 12:10
поделиться