2016-03-24 17 views
7

Sto caricando file nel bucket Amazon S3. I file vengono caricati ma ottengo il seguente avviso.Come impostare il contenuto di InputStream Lunghezza

AVVISO: lunghezza del contenuto non specificata per i dati del flusso. Il contenuto dello streaming verrà memorizzato nella memoria e potrebbe causare errori di memoria insufficiente.

Così ho aggiunto la seguente riga al mio codice

metaData.setContentLength(IOUtils.toByteArray(input).length); 

ma poi ho ottenuto il seguente messaggio. Non so nemmeno se sia un avvertimento o cosa.

I dati letti hanno una lunghezza diversa da quella prevista: dataLength = 0; expectedLength = 111992; includeSkipped = falso; in.getClass() = class sun.net.httpserver.FixedLengthInputStream; markedSupported = falso; contrassegnato = 0; resetSinceLastMarked = falso; markCount = 0; resetCount = 0

Come posso impostare contentLength sul metaData di InputSteam? Qualsiasi aiuto sarebbe molto apprezzato.

risposta

11

Quando si leggono i dati con IOUtils.toByteArray, si utilizza InputStream. Quando l'API AWS tenta di leggerlo, è a lunghezza zero.

leggere il contenuto in un array di byte e di fornire un InputStream avvolgimento tale matrice all'API:

byte[] bytes = IOUtils.toByteArray(input); 
metaData.setContentLength(bytes.length); 
ByteArrayInputStream byteArrayInputStream = new ByteArrayInputStream(bytes); 
PutObjectRequest putObjectRequest = new PutObjectRequest(bucket, key, byteArrayInputStream, metadata); 
client.putObject(putObjectRequest); 
+1

Si noti che se si sta caricando file di grandi dimensioni a s3 l'approccio di cui sopra prima caricare i dati in un array di byte. Ciò può causare un'eccezione di memoria insufficiente. – maxTrialfire

+0

@maxTrialfire In tal caso, come impedirebbe a OOM di verificarsi quando si carica un file di grandi dimensioni? – user482594

+2

@ user482594 In tal caso è necessario eseguire un caricamento chunked (multipart). – maxTrialfire

Problemi correlati