Ich lade eine Datei mit Java auf S3 hoch - das habe ich bisher:
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()));
Die Datei wird hochgeladen, aber eine WARNUNG wird ausgelöst, wenn ich die Inhaltslänge nicht einstelle:
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.
Dies ist eine Datei, die ich hochlade, und die stream
Variable ist eine InputStream
, aus der ich das Byte-Array wie folgt abrufen kann : IOUtils.toByteArray(stream)
.
Wenn ich also versuche, die Inhaltslänge und MD5 (von hier übernommen ) wie folgt einzustellen :
// 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);
Der folgende Fehler wird von S3 zurückgegeben:
Das von Ihnen angegebene Content-MD5 war ungültig.
Was mache ich falsch?
Jede Hilfe geschätzt!
PS Ich bin in Google App Engine - Ich kann die Datei nicht auf die Festplatte schreiben oder eine temporäre Datei erstellen, da AppEngine FileOutputStream nicht unterstützt.