2012-10-08 18 views
12

Tengo un archivo JPG con 800 KB. Intento subir a S3 y sigo recibiendo un error de tiempo de espera. ¿Puede por favor figura qué está mal? 800 KB es bastante pequeño para subir.amazon s3 upload file time out

Mensaje de error: La conexión de su socket al servidor no se leyó ni se escribió durante el tiempo de espera. Las conexiones inactivas estarán cerradas.

código de estado HTTP: 400

Código de error AWS: RequestTimeout

Long contentLength = null; 
System.out.println("Uploading a new object to S3 from a file\n"); 
try { 
    byte[] contentBytes = IOUtils.toByteArray(is); 
    contentLength = Long.valueOf(contentBytes.length); 
} catch (IOException e) { 
    System.err.printf("Failed while reading bytes from %s", e.getMessage()); 
} 

ObjectMetadata metadata = new ObjectMetadata(); 
metadata.setContentLength(contentLength);   

s3.putObject(new PutObjectRequest(bucketName, key, is, metadata)); 
+1

Esto me pasa de vez en cuando, y acabo de volver a intentar la carga. –

+0

Lo consigo todo el tiempo incluso con la carga de archivos de 1 KB. – user1688346

Respuesta

10

¿Es posible que IOUtils.toByteArray está drenando el flujo de entrada de modo que no hay más datos para ser leídos desde cuando se realiza la llamada de servicio? En ese caso, un stream.reset() solucionaría el problema.

Pero si solo está cargando un archivo (a diferencia de un InputStream arbitrario), puede usar la forma más simple de AmazonS3.putObject() que toma un archivo, y luego no tendrá que calcular el contenido longitud en absoluto.

http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/services/s3/AmazonS3.html#putObject(java.lang.String, java.lang.String, java.io.File)

Esto volverá a intentar automáticamente cualquier tipo de errores en la red varias veces. Puede ajustar cuántos reintentos usa el cliente al crear una instancia con un objeto ClientConfiguration.

http://docs.amazonwebservices.com/AWSJavaSDK/latest/javadoc/com/amazonaws/ClientConfiguration.html#setMaxErrorRetry(int)