Download

최신 업데이트:2025-08-18 15:54:18

WOS Java SDK는 다양한 오브젝트 다운로드 인터페이스를 제공합니다. WosClient.getObject를 사용하여 오브젝트를 다운로드할 수 있습니다.

1. 스트림 다운로드

아래 코드는 스트림 방식으로 오브젝트를 다운로드하는 방법을 보여줍니다.

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// WosClient 인스턴스 생성
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

WosObject wosObject = wosClient.getObject("bucketname", "objectname");

// 오브젝트 내용 읽기
System.out.println("Object content:");
InputStream input = wosObject.getObjectContent();
byte[] b = new byte[1024];
ByteArrayOutputStream bos = new ByteArrayOutputStream();
int len;
while ((len = input.read(b)) != -1) {
    bos.write(b, 0, len);
}
System.out.println(new String(bos.toByteArray()));
bos.close();
input.close();

참고사항:

  • WosClient.getObject가 반환하는 WosObject 인스턴스에는 버킷명, 오브젝트 키, 오브젝트 메타데이터, 오브젝트 입력 스트림 등이 포함되어 있습니다.
  • 입력 스트림을 통해 오브젝트의 내용을 로컬 파일이나 메모리로 읽어올 수 있습니다.

중요:

  • WosObject.getObjectContent로 가져온 입력 스트림은 반드시 명시적으로 close해야 하며, 그렇지 않으면 리소스 누수가 발생할 수 있습니다.

2. 범위 다운로드

오브젝트의 일부만 다운로드해야 할 경우, 범위 다운로드를 통해 원하는 데이터 영역만 받을 수 있습니다. 예를 들어 0~1000 범위를 지정하면 0부터 1000번째 바이트(총 1001바이트)를 반환합니다. 범위가 유효하지 않으면 전체 데이터가 반환됩니다.

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// WosClient 인스턴스 생성
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

GetObjectRequest request = new GetObjectRequest("bucketname", "objectname");
// 범위 시작과 끝 지정
request.setRangeStart(0L);
request.setRangeEnd(1000L);
WosObject wosObject = wosClient.getObject(request);

// 데이터 읽기
byte[] buf = new byte[1024];
InputStream in = wosObject.getObjectContent();
for (int n = 0; n != -1;) {
    n = in.read(buf, 0, buf.length);
}
in.close();

참고사항:

  • 범위가 유효하지 않은 경우(예: 음수이거나 파일 크기 초과) 전체 오브젝트가 반환됩니다.
  • 대형 파일은 여러 개의 범위 다운로드로 병렬 다운로드를 구현할 수 있으며, 자세한 내용은 ConcurrentDownloadObjectSample을 참고하세요.

3. 조건부 다운로드

오브젝트 다운로드 시 조건을 지정할 수 있으며, 지정 조건을 만족하지 않으면 예외가 발생하여 다운로드가 실패합니다.

사용 가능한 조건 파라미터는 아래와 같습니다:

파라미터 설명 Java SDK 메서드
If-Modified-Since 지정한 날짜 이후 오브젝트가 수정된 경우에만 반환하며, 아니면 예외가 발생합니다. GetObjectRequest.setIfModifiedSince
If-Unmodified-Since 지정한 날짜 이후로 오브젝트가 수정되지 않았을 경우에만 반환, 아니면 예외가 발생합니다. GetObjectRequest.setIfUnmodifiedSince
If-Match 오브젝트의 ETag와 일치해야만 반환, 아니면 예외가 발생합니다. GetObjectRequest.setIfMatchTag
If-None-Match 오브젝트의 ETag와 다를 경우에만 반환, 아니면 예외가 발생합니다. GetObjectRequest.setIfNoneMatchTag

참고사항:

  • 오브젝트의 ETag는 데이터의 MD5 체크섬입니다.
  • If-Unmodified-Since 또는 If-Match를 지정하고 조건을 충족하지 않으면 HTTP 상태코드로 412 Precondition Failed가 반환됩니다.
  • If-Modified-Since 또는 If-None-Match를 지정하고 조건을 충족하지 않으면 HTTP 상태코드로 304 Not Modified가 반환됩니다.

조건부 다운로드 예시

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// WosClient 인스턴스 생성
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

GetObjectRequest request = new GetObjectRequest("bucketname", "objectname");
request.setRangeStart(0L);
request.setRangeEnd(1000L);
request.setIfModifiedSince(new SimpleDateFormat("yyyy-MM-dd").parse("2016-01-01"));
WosObject wosObject = wosClient.getObject(request);

wosObject.getObjectContent().close();

4. 응답 헤더 재정의

오브젝트 다운로드 시 일부 HTTP/HTTPS 응답 헤더를 재정의할 수 있습니다. 재정의 가능한 헤더는 아래와 같습니다.

파라미터 설명 Java SDK 메서드
contentType Content-Type 헤더 재정의 ObjectRepleaceMetadata.setContentType
contentLanguage Content-Language 헤더 재정의 ObjectRepleaceMetadata.setContentLanguage
expires Expires 헤더 재정의 ObjectRepleaceMetadata.setExpires
cacheControl Cache-Control 헤더 재정의 ObjectRepleaceMetadata.setCacheControl
contentDisposition Content-Disposition 헤더 재정의 ObjectRepleaceMetadata.setContentDisposition
contentEncoding Content-Encoding 헤더 재정의 ObjectRepleaceMetadata.setContentEncoding

응답 헤더 재정의 예시

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// WosClient 인스턴스 생성
WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

GetObjectRequest request = new GetObjectRequest("bucketname", "objectname");
ObjectRepleaceMetadata replaceMetadata = new ObjectRepleaceMetadata();
replaceMetadata.setContentType("image/jpeg");
request.setReplaceMetadata(replaceMetadata);

WosObject wosObject = wosClient.getObject(request);
System.out.println(wosObject.getMetadata().getContentType());

wosObject.getObjectContent().close();

5. 사용자 정의 메타데이터 조회

오브젝트 다운로드 시 사용자 정의 메타데이터를 확인할 수 있습니다. 아래 코드는 사용자 정의 메타데이터 접근 방법을 보여줍니다.

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// WosClient 인스턴스 생성
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

// 사용자 정의 메타데이터와 함께 오브젝트 업로드
PutObjectRequest request = new PutObjectRequest("bucketname", "objectname");
ObjectMetadata metadata = new ObjectMetadata();
metadata.addUserMetadata("property", "property-value");
request.setMetadata(metadata);
wosClient.putObject(request);

// 오브젝트 다운로드 및 사용자 정의 메타데이터 확인
WosObject wosObject = wosClient.getObject("bucketname", "objectname");
System.out.println(wosObject.getMetadata().getUserMetadata("property"));

wosObject.getObjectContent().close();

6. 아카이브 오브젝트 다운로드

아카이브 스토리지 클래스에 저장된 오브젝트를 다운로드하려면 먼저 WosClient.restoreObject로 복원해야 합니다. 아래는 아카이브 오브젝트를 다운로드하는 방법입니다.

String endPoint = "https://your-endpoint";
String ak = "*** Provide your Access Key ***";
String sk = "*** Provide your Secret Key ***";

// WosClient 인스턴스 생성
final WosClient wosClient = new WosClient(ak, sk, endPoint, regionName);

RestoreObjectRequest request = new RestoreObjectRequest();
request.setBucketName("bucketname");
request.setObjectKey("objectname");
request.setDays(1);
wosClient.restoreObject(request);

// 오브젝트 복원이 완료되기를 대기
Thread.sleep(60 * 6 * 1000);

// 오브젝트 다운로드
WosObject wosObject = wosClient.getObject("bucketname", "objectname");

wosObject.getObjectContent().close();

참고사항:

  • WosClient.restoreObject로 지정한 오브젝트는 반드시 아카이브 스토리지 클래스여야 하며, 그렇지 않으면 예외가 발생합니다.
이 문서의 내용이 도움이 되었습니까?
아니오
정상적으로 제출되었습니다.피드백을 주셔서 감사합니다.앞으로도 개선을 위해 노력하겠습니다.