オブジェクトのダウンロード - Amazon Simple Storage Service

オブジェクトのダウンロード

このセクションでは、S3 バケットからオブジェクトをダウンロードする方法について説明します。

オブジェクトをダウンロードすると、データ転送料金が適用されます。Amazon S3 の機能と料金の詳細については、Amazon S3 を参照してください。

Amazon S3 コンソールを使用して、リクエストごとに 1 つのオブジェクトをダウンロードできます。複数のオブジェクトをダウンロードするには、AWS CLI、AWS SDK、または REST API を使用します。

プログラムでオブジェクトをダウンロードするとき、そのメタデータはレスポンスヘッダーに返されます。GET レスポンスで返されるレスポンスヘッダーの特定の値を上書きしたい場合があります。例えば、GET リクエストで Content-Disposition レスポンスヘッダー値を上書きする場合などです。REST GET Object API (「GET オブジェクト」を参照) を使用すると、GET リクエストでクエリ文字列パラメータを指定することで、それらの値を上書きできるようになります。Java 用の AWS SDK、.NET、および PHP でも、GET リクエストでレスポンスヘッダーの値を指定するために使用できる必要なオブジェクトが用意されています。

サーバー側暗号化によって暗号化されて保存されているオブジェクトを取得する場合、適切なリクエストヘッダーを指定する必要があります。詳細については、暗号化を使用したデータの保護 を参照してください。

このセクションでは、Amazon S3 コンソールを使用し、署名付き URL を使用して S3 バケットからオブジェクトをダウンロードする方法について説明します。

注記
  • 一度にダウンロードできるオブジェクトは 1 つだけです。

  • Amazon S3 コンソールを使用してダウンロードしたキー名がピリオド「.」で終わるオブジェクトは、ダウンロードしたオブジェクトのキー名からピリオド「.」が削除されます。ダウンロードしたオブジェクトのキー名の末尾をピリオド「.」に保持したままダウンロードするには、AWS Command Line Interface (AWS CLI)、AWS SDK、または REST API を使用します。

S3 バケットからオブジェクトをダウンロードするには

  1. AWS Management Console にサインインし、Amazon S3 コンソール (https://console.aws.amazon.com/s3/) を開きます。

  2. [Buckets] (バケット) リストで、オブジェクトのダウンロード元になるバケット名を選択します。

  3. 次のいずれかの方法で、S3 バケットからオブジェクトをダウンロードできます。

    • オブジェクトを特定のフォルダにダウンロードする場合は、[Action] (アクション) メニューから、[Download] (ダウンロード) または [Download as] (名前を付けてダウンロード) を選択します。

    • オブジェクトの特定バージョンをダウンロードする場合は、[Show versions] (バージョンの表示) ボタンを選択します。オブジェクトを特定のフォルダにダウンロードする場合は、目的のオブジェクトのバージョンを選択し、[Action] (アクション) メニューから、[Download] (ダウンロード) または [Download as] (名前を付けてダウンロード) を選択します。

Java

AWS SDK for Java を通じてオブジェクトをダウンロードすると、Amazon S3 はオブジェクトのすべてのメタデータと、オブジェクトのコンテンツを読み取る入力ストリームを返します。

オブジェクトを取得するには、次の操作を行います。

  • AmazonS3Client.getObject() メソッドを実行し、バケット名とオブジェクトキーをリクエストに含めます。

  • いずれかの S3Object インスタンスメソッドを実行して、入力ストリームを処理します。

注記

ネットワーク接続は、すべてのデータを読み取るか、入力ストリームを閉じるまで開いたままになります。ストリーミングのコンテンツは可能な限り迅速に読み取ることをお勧めします。

次に、使用のバリエーションをいくつか示します。

  • オブジェクト全体を読み取る代わりに、リクエスト内でバイト範囲を指定して、オブジェクトデータの一部だけを読み取ることができます。

  • オプションで、ResponseHeaderOverrides オブジェクトを使用してリクエストヘッダー値を上書きし、対応するリクエストプロパティを設定できます。例えば、この機能を使用すると、オブジェクトキー名とは異なるファイル名のファイルにオブジェクトをダウンロードするよう指定することができます。

次の例では、Amazon S3 バケットから 3 つの方法で (最初に完全なバケットとして、次にオブジェクトからのバイト範囲として、そして上書きされたレスポンスヘッダー値を持つ完全なオブジェクトとして)、オブジェクトを取得します。Amazon S3 からのオブジェクト取得の詳細については、GETObject を参照してください。ワーキングサンプルの作成とテストに関する手順については、Amazon S3 Java コード例のテスト を参照してください。

import com.amazonaws.AmazonServiceException; import com.amazonaws.SdkClientException; import com.amazonaws.auth.profile.ProfileCredentialsProvider; import com.amazonaws.regions.Regions; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3ClientBuilder; import com.amazonaws.services.s3.model.GetObjectRequest; import com.amazonaws.services.s3.model.ResponseHeaderOverrides; import com.amazonaws.services.s3.model.S3Object; import java.io.BufferedReader; import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; public class GetObject2 { public static void main(String[] args) throws IOException { Regions clientRegion = Regions.DEFAULT_REGION; String bucketName = "*** Bucket name ***"; String key = "*** Object key ***"; S3Object fullObject = null, objectPortion = null, headerOverrideObject = null; try { AmazonS3 s3Client = AmazonS3ClientBuilder.standard() .withRegion(clientRegion) .withCredentials(new ProfileCredentialsProvider()) .build(); // Get an object and print its contents. System.out.println("Downloading an object"); fullObject = s3Client.getObject(new GetObjectRequest(bucketName, key)); System.out.println("Content-Type: " + fullObject.getObjectMetadata().getContentType()); System.out.println("Content: "); displayTextInputStream(fullObject.getObjectContent()); // Get a range of bytes from an object and print the bytes. GetObjectRequest rangeObjectRequest = new GetObjectRequest(bucketName, key) .withRange(0, 9); objectPortion = s3Client.getObject(rangeObjectRequest); System.out.println("Printing bytes retrieved."); displayTextInputStream(objectPortion.getObjectContent()); // Get an entire object, overriding the specified response headers, and print the object's content. ResponseHeaderOverrides headerOverrides = new ResponseHeaderOverrides() .withCacheControl("No-cache") .withContentDisposition("attachment; filename=example.txt"); GetObjectRequest getObjectRequestHeaderOverride = new GetObjectRequest(bucketName, key) .withResponseHeaders(headerOverrides); headerOverrideObject = s3Client.getObject(getObjectRequestHeaderOverride); displayTextInputStream(headerOverrideObject.getObjectContent()); } catch (AmazonServiceException e) { // The call was transmitted successfully, but Amazon S3 couldn't process // it, so it returned an error response. e.printStackTrace(); } catch (SdkClientException e) { // Amazon S3 couldn't be contacted for a response, or the client // couldn't parse the response from Amazon S3. e.printStackTrace(); } finally { // To ensure that the network connection doesn't remain open, close any open input streams. if (fullObject != null) { fullObject.close(); } if (objectPortion != null) { objectPortion.close(); } if (headerOverrideObject != null) { headerOverrideObject.close(); } } } private static void displayTextInputStream(InputStream input) throws IOException { // Read the text input stream one line at a time and display each line. BufferedReader reader = new BufferedReader(new InputStreamReader(input)); String line = null; while ((line = reader.readLine()) != null) { System.out.println(line); } System.out.println(); } }
.NET

オブジェクトをダウンロードするときは、オブジェクトのメタデータと、コンテンツの読み取り元のストリームがすべて取得されます。ストリームコンテンツの読み取りはなるべく短時間で行う必要があります。データは Amazon S3 から直接ストリーミングされ、すべてのデータの読み取りが完了するか、入力ストリームを閉じるまで、ネットワーク接続は開いたままになるからです。オブジェクトを取得するには、次の操作を行います。

  • バケット名とオブジェクトキーをリクエストに含めて、getObject メソッドを実行します。

  • いずれかの GetObjectResponse メソッドを実行して、ストリームを処理します。

次に、使用のバリエーションをいくつか示します。

  • オブジェクト全体を読み取る代わりに、オブジェクトデータの一部だけを読み取るには、次の C# の例に示すとおり、リクエスト内でバイト範囲を指定します。

    GetObjectRequest request = new GetObjectRequest { BucketName = bucketName, Key = keyName, ByteRange = new ByteRange(0, 10) };
  • オブジェクトを取得するときに、オプションで、オブジェクトのダウンロード オブジェクトを使用してリクエストヘッダー値を上書きし (ResponseHeaderOverrides を参照)、対応するリクエストプロパティを設定できます。次の C# コード例は、これを実行する方法を説明しています。例えば、この機能を使用すると、オブジェクトキー名とは異なるファイル名のファイルにオブジェクトをダウンロードするよう指定することができます。

    GetObjectRequest request = new GetObjectRequest { BucketName = bucketName, Key = keyName }; ResponseHeaderOverrides responseHeaders = new ResponseHeaderOverrides(); responseHeaders.CacheControl = "No-cache"; responseHeaders.ContentDisposition = "attachment; filename=testing.txt"; request.ResponseHeaderOverrides = responseHeaders;

次の C# サンプルコードでは、Amazon S3 バケットからオブジェクトを取得します。この例では、GetObjectResponse.ResponseStream プロパティを使用してレスポンスからオブジェクトデータを読み取っています。この例はまた、GetObjectResponse.Metadata コレクションを使用してオブジェクトのメタデータを読み取る方法も示しています。取得するオブジェクトに x-amz-meta-title 値がある場合は、コードがそのメタデータ値を出力します。

作業サンプルを作成およびテストする方法については、Amazon S3 .NET コード例の実行 を参照してください。

using Amazon; using Amazon.S3; using Amazon.S3.Model; using System; using System.IO; using System.Threading.Tasks; namespace Amazon.DocSamples.S3 { class GetObjectTest { private const string bucketName = "*** bucket name ***"; private const string keyName = "*** object key ***"; // Specify your bucket region (an example region is shown). private static readonly RegionEndpoint bucketRegion = RegionEndpoint.USWest2; private static IAmazonS3 client; public static void Main() { client = new AmazonS3Client(bucketRegion); ReadObjectDataAsync().Wait(); } static async Task ReadObjectDataAsync() { string responseBody = ""; try { GetObjectRequest request = new GetObjectRequest { BucketName = bucketName, Key = keyName }; using (GetObjectResponse response = await client.GetObjectAsync(request)) using (Stream responseStream = response.ResponseStream) using (StreamReader reader = new StreamReader(responseStream)) { string title = response.Metadata["x-amz-meta-title"]; // Assume you have "title" as medata added to the object. string contentType = response.Headers["Content-Type"]; Console.WriteLine("Object metadata, Title: {0}", title); Console.WriteLine("Content type: {0}", contentType); responseBody = reader.ReadToEnd(); // Now you process the response body. } } catch (AmazonS3Exception e) { // If bucket or object does not exist Console.WriteLine("Error encountered ***. Message:'{0}' when reading object", e.Message); } catch (Exception e) { Console.WriteLine("Unknown encountered on server. Message:'{0}' when reading object", e.Message); } } } }
PHP

このトピックでは、AWS SDK for PHP のクラスを使用して Amazon S3 オブジェクトを取得する方法について説明します。オブジェクトの全体を取得することも、またはオブジェクトのバイト範囲を取得することもできます。ここでは、既に AWS SDK for PHP の使用と PHP サンプルの実行 の手順が実行されていて、AWS SDK for PHP が正しくインストールされていることを前提としています。

オブジェクトを取得するときは、オプションでレスポンスヘッダーの値を上書きすることもできます。上書きするには、次の PHP コード例に示すとおり、レスポンスキー、ResponseContentTypeResponseContentLanguageResponseContentDispositionResponseCacheControl、および ResponseExpiresgetObject() メソッドに追加します。

$result = $s3->getObject([ 'Bucket' => $bucket, 'Key' => $keyname, 'ResponseContentType' => 'text/plain', 'ResponseContentLanguage' => 'en-US', 'ResponseContentDisposition' => 'attachment; filename=testing.txt', 'ResponseCacheControl' => 'No-cache', 'ResponseExpires' => gmdate(DATE_RFC2822, time() + 3600), ]);

オブジェクトの取得については、オブジェクトのダウンロード を参照してください。

次の PHP コード例では、オブジェクトを取得し、そのオブジェクトのコンテンツをブラウザに表示します。この例は getObject() メソッドの使用方法を示しています。PHP 例の実行については、このガイド内の PHP サンプルの実行 を参照してください。

require 'vendor/autoload.php'; use Aws\S3\S3Client; use Aws\S3\Exception\S3Exception; $bucket = '*** Your Bucket Name ***'; $keyname = '*** Your Object Key ***'; $s3 = new S3Client([ 'version' => 'latest', 'region' => 'us-east-1' ]); try { // Get the object. $result = $s3->getObject([ 'Bucket' => $bucket, 'Key' => $keyname ]); // Display the object in the browser. header("Content-Type: {$result['ContentType']}"); echo $result['Body']; } catch (S3Exception $e) { echo $e->getMessage() . PHP_EOL; }

AWS SDK を使用して、バケットからオブジェクトキーを取得できます。ただし、アプリケーションで必要な場合は、REST リクエストを直接送信できます。GET リクエストを送信してオブジェクトキーを取得できます。

リクエストとレスポンスの形式については、GetObject を参照してください。

以下の例は、AWS CLI を使用して Amazon S3 からオブジェクトをダウンロードする方法を示しています。詳細と例については、AWS CLI コマンドリファレンスget−object を参照してください。

aws s3api get-object --bucket DOC-EXAMPLE-BUCKET1 --key dir/my_images.tar.bz2 my_images.tar.bz2