Wgrywam plik do S3 za pomocą Javy - tak mam do tej pory:
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()));
Plik jest przesyłany, ale pojawia się OSTRZEŻENIE, gdy nie ustawiam długości treści:
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.
Ten plik jest mi przesłać, a stream
zmienna jest InputStream
, z którego można uzyskać tablicę bajtów takiego: IOUtils.toByteArray(stream)
.
Więc kiedy próbuję ustawić długość treści i MD5 (wzięte stąd ) w ten sposób:
// 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);
Powoduje to powrót następującego błędu z S3:
Podany Content-MD5 był nieprawidłowy.
Co ja robię źle?
Każda pomoc doceniona!
PS Korzystam z Google App Engine - nie mogę zapisać pliku na dysk ani utworzyć pliku tymczasowego, ponieważ AppEngine nie obsługuje funkcji FileOutputStream.