[解決済み] AmazonS3 putObject with InputStream lengthの例
2023-04-23 05:29:24
質問
私はJavaを使用してS3にファイルをアップロードしています - これは私がこれまでに得たものです。
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()));
ファイルはアップロードされていますが、コンテンツの長さを設定していない場合、WARNINGが発生します。
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.
これはアップロードしているファイルと
stream
という変数が
InputStream
で、そこからこのようなバイト配列が得られます。
IOUtils.toByteArray(stream)
.
そこで、コンテンツの長さと MD5 を設定しようとすると ( ここで ) をこのように設定します。
// 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);
S3から以下のようなエラーが返ってくるようになります。
指定されたContent-MD5が無効でした。
私は何を間違えているのでしょうか?
どんな助けでも感謝します!
P.S. 私はGoogle App Engineを使用しています - 私はディスクにファイルを書き込むことができないか、または 一時ファイルを作成する AppEngineはFileOutputStreamをサポートしていないためです。
どのように解決するのですか?
元の質問には回答がなく、私もこの同じ問題にぶつかることになったので、MD5問題の解決策は、S3は私たちが通常考えるHexエンコードされたMD5文字列を望んでいないということです。
その代わりに、私はこれをしなければなりませんでした。
// content is a passed in InputStream
byte[] resultByte = DigestUtils.md5(content);
String streamMD5 = new String(Base64.encodeBase64(resultByte));
metaData.setContentMD5(streamMD5);
本質的に彼らが MD5 値に求めているのは Base64 でエンコードされた生の MD5 バイト配列であり、Hex 文字列ではありません。私がこれに切り替えたとき、それは私にとって素晴らしく機能するようになりました。
関連
-
Eclipseは、ポップアップA Java Exception has occurred.を実行し、エラーException in threadの解決策を報告します。
-
executeQuery()でデータ操作文が発行できない。解決方法
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
Javaがリソースリークに遭遇した:'input'が閉じない 解決方法
-
コンストラクタDate()が未定義である問題
-
[解決済み] JavaでInputStreamを読み込んでStringに変換するにはどうすればよいですか?
-
[解決済み] Mavenを使用して、依存関係を持つ実行可能なJARを作成するにはどうすればよいですか?
-
[解決済み] JavaでStringをInputStreamに変換する方法を教えてください。
-
[解決済み] JavaでInputStreamをバイト配列に変換する
-
[解決済み] OutputStreamをInputStreamに変換する方法は?
最新
-
nginxです。[emerg] 0.0.0.0:80 への bind() に失敗しました (98: アドレスは既に使用中です)
-
htmlページでギリシャ文字を使うには
-
ピュアhtml+cssでの要素読み込み効果
-
純粋なhtml + cssで五輪を実現するサンプルコード
-
ナビゲーションバー・ドロップダウンメニューのHTML+CSSサンプルコード
-
タイピング効果を実現するピュアhtml+css
-
htmlの選択ボックスのプレースホルダー作成に関する質問
-
html css3 伸縮しない 画像表示効果
-
トップナビゲーションバーメニュー作成用HTML+CSS
-
html+css 実装 サイバーパンク風ボタン
おすすめ
-
undefined[sonar] sonar:デフォルトのスキャンルール
-
java.sql.SQLException: executeQuery()でデータ操作文を発行できません。
-
スレッド "main" での例外 java.lang.ArrayIndexOutOfBoundsException:5 エラー
-
Jsoup-Crawlingの動作
-
JAVA_HOME環境変数が正しく定義されていない問題を解決する
-
名前 'XXX' を持つ Bean の作成に失敗しました。自動依存関係の注入に失敗しました 解決方法
-
Javaジェネリックを1つの記事で
-
XXX型を囲むインスタンスがJavaでアクセスできない
-
Zipファイルの圧縮・解凍にantを使用する
-
[解決済み] JavaでMD5ハッシュを生成するにはどうすればよいですか?