2016-03-24 10 views
7

Amazon S3バケットにファイルをアップロードしています。ファイルはアップロードされていますが、次の警告が表示されます。InputStreamコンテンツの設定方法長さ

警告:ストリームデータのコンテンツ長は指定されていません。ストリームの内容 がメモリにバッファリングされ、メモリ不足エラーが発生する可能性があります。

だから私は私のコード

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

に次の行を追加したが、その後、私は、次のメッセージが表示されました。私はそれが警告か何かであるかどうかわからない。

データの読み込みの長さは、期待される長さとは異なります。dataLength = 0; expectedLength = 111992; includeSkipped = false; in.getClass()=クラス sun.net.httpserver.FixedLengthInputStream; markedSupported = false; = 0; resetSinceLastMarked = false; markCount = 0; resetCount = 0

InputSteamのメタデータにcontentLengthを設定するにはどうすればよいですか?どんな助けでも大歓迎です。

答えて

11

IOUtils.toByteArrayでデータを読み取ると、これはInputStreamを消費します。 AWS APIがそれを読み込もうとすると、長さはゼロになります。

バイト配列に内容を読み、APIにその配列のラップInputStreamを提供します。あなたが最初のバイト配列内のデータをロード上記のアプローチをS3に大きなファイルをアップロードしている場合は、その

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

注意。これにより、メモリ不足の例外が発生する可能性があります。 – maxTrialfire

+0

@maxTrialfireその場合、大きなファイルをアップロードするときにOOMが実行されないようにしますか? – user482594

+2

@ user482594その場合は、チャンク(マルチパート)アップロードを行う必要があります。 – maxTrialfire

関連する問題