객체 다운로드 - Amazon Simple Storage Service

객체 다운로드

이 섹션에서는 S3 버킷에서 객체를 다운로드하는 방법을 설명합니다.

객체를 다운로드할 때는 데이터 전송 요금이 부과됩니다. Amazon S3 기능 및 요금에 대한 자세한 내용은 Amazon S3를 참조하세요.

Amazon S3 콘솔을 사용하여 요청당 단일 객체를 다운로드할 수 있습니다. 여러 객체를 다운로드하려면 AWS CLI, AWS SDK 또는 REST API를 사용합니다.

프로그래밍 방식으로 개체를 다운로드하면 응답 헤더에 해당 메타데이터가 반환됩니다. GET 응답에 반환된 특정 응답 헤더 값을 무시해야 할 수 있습니다. 예를 들어, GET 요청에서 Content-Disposition 응답 헤더 값을 무시할 수 있습니다. REST GET Object API(GET Object 참조)를 사용하면 GET 요청에 쿼리 문자열 파라미터를 지정하여 이 값을 무시할 수 있습니다. 또한, AWS SDK for Java/.NET/PHP는 GET 요청에서 이러한 응답 헤더를 위한 값을 지정하는 데 사용할 수 있는 필수 객체를 제공합니다.

서버 측 암호화를 사용하여 암호화된 상태로 저장된 객체를 검색하려면 적절한 요청 헤더를 제공해야 합니다. 자세한 정보는 암호화를 사용하여 데이터 보호을 참조하십시오.

이 섹션에서는 Amazon S3 콘솔을 사용하여 미리 서명된 URL을 사용하여 S3 버킷에서 객체를 다운로드하는 방법에 대해 설명합니다.

참고
  • 한 번에 하나의 객체만 다운로드할 수 있습니다.

  • Amazon S3 콘솔을 사용하여 키 이름이 마침표 '.'로 끝나는 객체의 경우 다운로드한 객체의 키 이름에서 마침표 '.'가 제거됩니다. 다운로드한 객체에 보존된, 키 이름이 마침표 '.'로 끝나는 객체를 다운로드하려면AWS Command Line Interface(AWS CLI), AWS SDK 또는 REST API를 사용해야 합니다.

S3 버킷에서 객체 다운로드

  1. AWS Management Console에 로그인한 후 https://console.aws.amazon.com/s3/에서 Amazon S3 콘솔을 엽니다.

  2. 버킷(Buckets) 목록에서 객체를 다운로드할 버킷의 이름을 선택합니다.

  3. 다음 방법 중 하나를 사용하여 S3 버킷에서 객체를 다운로드할 수 있습니다.

    • 객체를 선택하고 작업(Actions) 메뉴에서 다운로드(Download) 또는 다음으로 다운로드(Download as)(객체를 특정 폴더로 다운로드하려는 경우)를 선택합니다.

    • 특정 버전의 객체를 다운로드하려면 버전 표시(Show versions) 버튼을 선택합니다. 원하는 버전의 객체를 선택하고 작업(Actions) 메뉴에서 다운로드(Download) 또는 다음으로 다운로드(Download as)(객체를 특정 폴더로 다운로드하려는 경우)를 선택합니다.

Java

AWS SDK for Java를 통해 객체를 다운로드하면 Amazon S3가 모든 객체의 메타데이터와 객체의 콘텐츠를 읽기 위한 입력 스트림을 반환합니다.

객체를 검색하려면 다음을 수행합니다.

  • 요청에 버킷 이름과 객체 키를 제공하여 AmazonS3Client.getObject() 메서드를 실행합니다.

  • S3Object 인스턴스 메서드 중 하나를 실행하여 입력 스트림을 처리합니다.

참고

모든 데이터를 읽거나 입력 스트림을 닫을 때까지 네트워크 연결이 열린 상태로 유지됩니다. 따라서 최대한 빨리 스트림의 콘텐츠를 읽는 것이 좋습니다.

다음은 사용할 수 있는 몇 가지 변형 형태입니다.

  • 전체 객체를 읽는 대신, 요청에서 원하는 바이트 범위를 지정하여 객체 데이터의 일부만 읽을 수 있습니다.

  • ResponseHeaderOverrides 객체를 사용하고 해당 요청 속성을 설정하여 필요할 경우 응답 헤더 값을 무시할 수 있습니다. 예를 들어 이 기능을 사용하여 객체 키 이름과 다른 파일 이름을 가진 파일로 다운로드해야 할 객체를 지정할 수 있습니다.

다음 예제에서는 세 가지 방법으로 Amazon S3 버킷에서 객체를 검색합니다. 먼저 전체 객체로 검색하고 이어서 객체의 바이트 범위로 검색한 다음, 무시된 응답 헤더 값을 가진 전체 객체로 검색합니다. Amazon S3에서 객체 가져오기에 대한 자세한 내용은 GET Object 단원을 참조하십시오. 실제 예제를 작성 및 테스트하는 방법에 대한 자세한 내용은 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 코드 예제에서와 같이 ResponseContentType 메서드에 응답 키인 ResponseContentLanguage, ResponseContentDisposition, ResponseCacheControl, 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 요청을 전송하여 객체 키를 검색할 수 있습니다.

요청 및 응답 형식에 대한 자세한 내용은 Get Object를 참조하세요.

아래 예제에서는 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