S3へのファイルアップロードをcontent-lengthヘッダなしでストリーミングすることは可能ですか?
質問
私はメモリが限られたマシンで作業しており、動的に生成された(ディスクからではない)ファイルをストリーミング方式で S3 にアップロードしたいと思っています。 言い換えれば、私はアップロードを開始するときにファイル サイズを知らないが、終了時には知っているだろう。 通常、PUTリクエストはContent-Lengthヘッダを持ちますが、おそらく、マルチパートまたはチャンクされたcontent-typeを使用するなど、これを回避する方法があるのでしょう。
S3はストリーミングアップロードをサポートすることができます。 例えば、こちらをご覧ください。
http://blog.odonnell.nu/posts/streaming-uploads-s3-python-and-poster/
質問は、アップロードの開始時にファイルの長さを指定しなくても、同じことを達成できるでしょうか。
どのように解決するのですか?
5MiB以上のファイルをアップロードするには S3のマルチパートAPI . これらの各チャンクには Content-Length が必要ですが、メモリに大量のデータ (100MiB 以上) を読み込むことを避けることができます。
- S3を開始する マルチパートアップロード .
- バッファがS3のチャンクサイズの下限(5MiB)に達するまで、データをバッファに集めます。バッファを構築している間にMD5チェックサムを生成します。
- そのバッファを パート としてアップロードし、ETagを保存します(これについてはドキュメントを読んでください)。
- データのEOFに到達したら、最後のチャンクをアップロードします(5MiBより小さくすることができます)。
- Multipart Upload を確定します。
S3は10,000パーツまで可能です。したがって、5MiB のパーツサイズを選択することで、最大 50GiB の動的ファイルをアップロードできるようになります。ほとんどのユースケースで十分でしょう。
しかし、それ以上必要な場合は、パーツ サイズを大きくする必要があります。より大きなパーツ サイズ (たとえば 10MiB) を使用するか、アップロード中にサイズを大きくする必要があります。
First 25 parts: 5MiB (total: 125MiB)
Next 25 parts: 10MiB (total: 375MiB)
Next 25 parts: 25MiB (total: 1GiB)
Next 25 parts: 50MiB (total: 2.25GiB)
After that: 100MiB
これにより、1TBまでのファイル(S3の1ファイルの上限は現在5TB)を、不必要にメモリを消費することなくアップロードできるようになります。
あなたの は Sean O'Donnells のブログへのリンクです。 :
彼の問題は、あなたとは異なります。彼は、アップロードの前に Content-Length を知っており、それを使用しています。彼は、この状況を改善したいと考えています。多くのライブラリは、ファイルからすべてのデータをメモリにロードすることにより、アップロードを処理します。擬似コードでは、このようになります。
data = File.read(file_name)
request = new S3::PutFileRequest()
request.setHeader('Content-Length', data.size)
request.setBody(data)
request.send()
彼の解決策は
Content-Length
をファイルシステム API 経由で取得します。そして、ディスクからリクエストストリームにデータをストリームします。擬似コードでは
upload = new S3::PutFileRequestStream()
upload.writeHeader('Content-Length', File.getSize(file_name))
upload.flushHeader()
input = File.open(file_name, File::READONLY_FLAG)
while (data = input.read())
input.write(data)
end
upload.flush()
upload.close()
関連
-
multipart/form-data と application/octet-stream, application/x-www-form-urlencoded の違いについて
-
[解決済み] HTTP_CLIENT_IPとHTTP_X_FORWARDED_FORの違いは何ですか?
-
[解決済み] HTTPステータスコード0 - Error Domain=NSURLErrorDomain?
-
[解決済み] X-Forwarded-Hostヘッダーの実際の使用方法?
-
[解決済み] HttpClientリクエストのContent-Typeヘッダーはどのように設定するのですか?
-
[解決済み] HTTPファイルアップロードの仕組みを教えてください。
-
[解決済み] ファイルのダウンロードにContent-Type: application/octet-streamは必要ですか?
-
[解決済み】http:// のリンクを全て // に変更することは可能ですか?
-
[解決済み] ブラウザがファイルのダウンロードを受信したことを検出する
-
[解決済み] s3.upload()にストリームをパイプする
最新
-
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 実装 サイバーパンク風ボタン
おすすめ
-
[解決済み] ERR_INVALID_CHUNKED_ENCODING エラーの修正方法を教えてください。
-
[解決済み] X-REQUEST-ID httpヘッダーとは何ですか?
-
[解決済み] ブラウザによって異なるURLの最大長とは?
-
[解決済み] Cache-Control: max-age=0とno-cacheの違いは何ですか?
-
[解決済み] HTTPリダイレクト:301(永久)と302(一時)の比較
-
[解決済み] Firefoxで突然「Blocked loading mixed active content」問題が発生したのはなぜですか?
-
[解決済み] application/x-www-form-urlencoded or multipart/form-data?
-
[解決済み] [Solved] リクエストに必須パラメータがない場合、どのようなHTTPステータスレスポンスコードを使用すればよいですか?
-
[解決済み】AngularでHTTPリクエストにURL引数(クエリ文字列)を渡すには?
-
[解決済み】マイクロサービスのオーケストレーション