2016-03-24 8 views
7

Ich lade Dateien in den Amazon S3-Bucket hoch. Die Dateien werden hochgeladen, aber ich bekomme die folgende Warnung.Wie wird der InputStream-Inhalt festgelegt? Länge

WARNUNG: Keine Inhaltslänge für Stream-Daten angegeben. Der Stream-Inhalt wird im Speicher gepuffert und könnte zu Fehlern im Arbeitsspeicher führen.

So habe ich die folgende Zeile in meinem Code

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

aber dann bekam ich die folgende Meldung. Ich weiß nicht einmal, ob es eine Warnung oder was ist.

Daten lesen hat eine andere Länge als erwartet: dataLength = 0; expectedLength = 111992; includeSkipped = false; in.getClass() = class sun.net.httpserver.FixedLengthInputStream; markedSupported = false; markiert = 0; resetSinceLastMarked = false; markCount = 0; resetCount = 0

Wie kann ich contentLength auf die MetaData von InputSteam setzen? Jede Hilfe würde sehr geschätzt werden.

Antwort

11

Wenn Sie die Daten mit IOUtils.toByteArray lesen, verbraucht dies den InputStream. Wenn die AWS-API versucht, sie zu lesen, hat sie keine Länge.

den Inhalt in ein Byte-Array lesen und einen Inputstream bieten das Array an die API Einwickeln:

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

Beachten Sie, dass, wenn Sie große Dateien hochladen, den oben beschriebenen Ansatz s3 zuerst die Daten in einem Byte-Array laden. Dies kann eine Ausnahme wegen zu wenig Arbeitsspeicher verursachen. – maxTrialfire

+0

@maxTrialfire Wie würden Sie in diesem Fall verhindern, dass OOM beim Hochladen einer großen Datei passiert? – user482594

+2

@ user482594 In diesem Fall müssen Sie einen Chunked-Upload (mehrteilig) durchführen. – maxTrialfire