aws s3 api dotnet core -01

s3를 api로 관리해야할 일이 생겨서 잠시 봤다 적어둘게 생겨서 블로깅

ListObjectsRequest vs ListObjectsV2Request

검색을 해보다 보면 ListObjectsRequest 도 보이고 ListObjectsV2Request도 보인다.

샘플코드들이 대부분 ListObjectsRequest로 보이고 있어서 두개의 차이점이 궁금했다.

https://docs.aws.amazon.com/AmazonS3/latest/API/API_ListObjectsV2.html

For backward compatibility, Amazon S3 continues to support the prior version of this API, ListObjects.

ListObjectsV2Request 를 사용하면 되겟다.

bucket, object ,folder and file

버킷은 제일 상위단계를 말한다.

오브젝트는 bucket하위에 있는 것을 말한다.

directory 와 file로 헷갈리기 쉬운데 사실 s3는 key/value로 저장되는데 key가 bucket-a/objeject-a/ojbect-b.jpg 이고 이 키에 물려서 value로 파일을 저장하는듯 보인다.

folder처럼 보이는것은 이름이 끝날때 / 로 끝나면 폴더처럼 s3에서 보여주는것 뿐이다.

정리하면 / 로 끝나면 폴더 , 없으면 파일이다.

low level api vs high level api

low level은 AmazonS3Client를 직접 사용하는것이고

high level은 TransferUtility를 사용하는것이다. TransferUtility를 사용하는게 좋아보인다. 파일을 여러개로 짤라서 업로드하는 기능도 제공하고 여러가지 편의가 있다.

list object

샘플 코드를 확인해보면

// Create a client
AmazonS3Client client = new AmazonS3Client();

// List all objects
ListObjectsRequest listRequest = new ListObjectsRequest
{
    BucketName = "SampleBucket",
};

ListObjectsResponse listResponse;
do
{
    // Get a list of objects
    listResponse = client.ListObjects(listRequest);
    foreach (S3Object obj in listResponse.S3Objects)
    {
        Console.WriteLine("Object - " + obj.Key);
        Console.WriteLine(" Size - " + obj.Size);
        Console.WriteLine(" LastModified - " + obj.LastModified);
        Console.WriteLine(" Storage class - " + obj.StorageClass);
    }

    // Set the marker property
    listRequest.Marker = listResponse.NextMarker;
} while (listResponse.IsTruncated);

이러면 전체 리스트를 쭉 뿌려줄수 있다.

파일 브라우저 형태를 만들려고 하는데 모든 데이터를 다 가져오다 보니 s3에 하위에 파일이 1000개가 있으면 파일을 다 가져오게 된다.

예를 들면

이렇게 6개가 나와야하는데

aaaaaa/assets/2017-01-20 05.01.01.png
aaaaaa/assets/2017-01-20 05.01.02.png
aaaaaa/assets/2017-01-20 05.01.03.png
aaaaaa/assets/2017-01-20 05.01.04.png

등을 포함해서 모든 리스트가 나와버린다. 하루를 고민한 끝에 방법을 찾았다. Delimiter를 사용하면 된다.

delimiter 뜻 : 구분자

delimiter 를 /로 주면 key값을 구분해 주나 보자.

high level api를 사용해보자.

var fileTransferUtility = new TransferUtility(_client);

var request = new ListObjectsV2Request()
{
  BucketName = "bucket-a",
  Prefix = "aaaa/",
  Delimiter = "/"
};

var response = await fileTransferUtility.S3Client.ListObjectsV2Async(request);

foreach (S3Object entry in response.S3Objects)
{
  Console.WriteLine("asdf key = {0}, size = {1}", entry.Key, entry.Size);
}

foreach (var name in response.CommonPrefixes)
{
  Console.WriteLine("asdf key = {0}, size = {1}", entry.Key, entry.Size);
}

return data;

이렇게 Delimiter를 주고 request를 보내면 결과값으로 딱 파일만 준다. 폴더에 있는 파일만 준다.

그럼 폴더에 있는 subfolder는 어떻게 구할수 있냐? 라는게 관건인데 … response.CommonPrefixes에 보면 폴더들 이름이 리스트로 딱 들어가져 있다.

이걸 가져다 쓰면된다.

오늘은 여기까지 계속 업데이트 하자.

다음편을 보면 된다.

teamsmiley's profile image

teamsmiley

2021-03-19 00:00

Read more posts by this author