Estoy cargando un archivo en S3 usando Java; esto es lo que obtuve hasta ahora:
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()));
El archivo se está cargando pero aparece una ADVERTENCIA cuando no estoy configurando la longitud del contenido:
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.
Este es un archivo Estoy subiendo y la stream
variable es una InputStream
, de la que puede obtener la matriz de bytes de esta manera: IOUtils.toByteArray(stream)
.
Entonces, cuando trato de establecer la longitud del contenido y MD5 (tomado de aquí ) de esta manera:
// 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);
Provoca que el siguiente error vuelva desde S3:
El Content-MD5 que especificó no es válido.
¿Qué estoy haciendo mal?
¡Cualquier ayuda apreciada!
PD : Estoy en Google App Engine: no puedo escribir el archivo en el disco o crear un archivo temporal porque AppEngine no es compatible con FileOutputStream.