26

Amazon S3 REST API ドキュメントによると、PUT 操作でのアップロードには 5 GB のサイズ制限があります。それより大きいファイルは、マルチパートを使用してアップロードする必要があります。罰金。

ただし、本質的に必要なのは、それよりも大きい可能性のあるファイルの名前を変更することです。私が知る限り、名前の変更や移動の操作はないため、ファイルを新しい場所にコピーして古い場所を削除する必要があります。5 GB を超えるファイルの場合、どのように正確に行われますか? バケットからバケット自体へのマルチパート アップロードを行う必要がありますか? その場合、ファイルを部分的に分割するとどのように機能しますか?

boto のソースを読むと、5 GB を超えるファイルに対して自動的にこのようなことを行うようには見えません。私が見逃した組み込みのサポートはありますか?

4

4 に答える 4

22

私の知る限り、名前の変更や移動操作はありません。そのため、ファイルを新しい場所にコピーし、古い場所を削除する必要があります。

その通りです。5 GB 未満のオブジェクト/ファイルの場合は、PUT オブジェクト - コピー操作の後にDELETE オブジェクト操作を行うことで非常に簡単に行うことができます (どちらももちろんbotoでサポートされています。copy_key()delete_key(を参照)。 ) ):

この PUT オペレーションの実装は、Amazon S3 にすでに保存されているオブジェクトのコピーを作成します。PUT コピー操作は、GET を実行してから PUT を実行するのと同じです。リクエスト ヘッダー x-amz-copy-source を追加すると、PUT 操作でソース オブジェクトが宛先バケットにコピーされます。

ただし、5 GB を超えるオブジェクト/ファイルの場合、実際には不可能です。


[...] この API を使用して、1 回のアトミック操作で最大 5 GB のサイズのオブジェクトのコピーを作成します。ただし、5 GB を超えるオブジェクトをコピーするには、マルチパート アップロード API を使用する必要があります。概念的な情報 [...] については、マルチパート アップロードを使用したオブジェクトのアップロード[...] [emphasis mine] を参照してください。

一方、Boto はcopy_part_from_key()メソッドを使用してこれをサポートします。残念ながら、必要なアプローチは、それぞれのプル リクエスト #425 (マルチパート コピー コマンドを許可する)以外では文書化されていません (ただし、私自身はまだ試していません)。

import boto
s3 = boto.connect_s3('access', 'secret')
b = s3.get_bucket('destination_bucket')
mp = b.initiate_multipart_upload('tmp/large-copy-test.mp4')
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 1, 0, 999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 2, 1000000000, 1999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 3, 2000000000, 2999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 4, 3000000000, 3999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 5, 4000000000, 4999999999)
mp.copy_part_from_key('source_bucket', 'path/to/source/key', 6, 5000000000, 5500345712)
mp.complete_upload()

最終的に Java または .NET でこれを実現する方法については、それぞれのサンプルを調べることをお勧めします。これにより、一般的なアプローチについてより多くの洞察が得られる可能性があり ます。マルチパート アップロード API を使用したオブジェクトのコピー を参照してください。

幸運を!


付録

一般的に見落とされがちな、コピーに関する次の特性に注意してください。

オブジェクトをコピーする場合、ほとんどのメタデータを保持するか (デフォルト)、新しいメタデータを指定できます。ただし、ACL は保持されず、リクエストを行うユーザーに対して非公開に設定されます。デフォルトの ACL 設定を上書きするには、x-amz-acl ヘッダーを使用して、コピー リクエストの生成時に新しい ACL を指定します。詳細については、Amazon S3 ACL を参照してください。[鉱山を強調]

于 2012-04-28T15:57:26.090 に答える
10

上記はほぼ機能していましたが、残念ながらmp.complete_upload() タイプミスではなくupload_complete()!で終了する必要がありました。

AWS Java の例に基づいて、動作する boto s3 マルチパート コピー スクリプトをここに追加し、5 GiB を超えるファイルでテストしました。

https://gist.github.com/joshuadfranklin/5130355

于 2013-03-10T21:10:33.053 に答える