C++Builder Programming Forum
C++Builder  |  Delphi  |  FireMonkey  |  C/C++  |  Free Pascal  |  Firebird
볼랜드포럼 BorlandForum
 경고! 게시물 작성자의 사전 허락없는 메일주소 추출행위 절대 금지
C++빌더 포럼
Q & A
FAQ
팁&트릭
강좌/문서
자료실
컴포넌트/라이브러리
메신저 프로젝트
볼랜드포럼 홈
헤드라인 뉴스
IT 뉴스
공지사항
자유게시판
해피 브레이크
공동 프로젝트
구인/구직
회원 장터
건의사항
운영진 게시판
회원 메뉴
북마크
볼랜드포럼 광고 모집

C++빌더 팁&트릭
C++Builder Programming Tip&Tricks
[1192] 아마존 S3 서비스 이용 함수
초행길 [bluepos] 68 읽음    2024-05-08 22:56
아마존 S3 서비스를 이용하기 위해서  현재 실무에서 이용하고 있는 함수 소스입니다.
(개발 환경은 Windows 11 Pro, RAD Studio 11 Alexandria 입니다.)

c++ 빌더로 프로그램을 만들때 필요한 콤포넌트는 AmazonConnectionInfo 입니다.
AmazonConnectionInfo 콤포넌트를 폼에 올려놓고 아래 소스를 이용하시면 됩니다.

1. 파일 업로드 함수 : AmazonS3_Upload
2. 파일 삭제 함수 : AmazonS3_Delete
3. 파일 존재 유무 확인 함수 : AmazonS3_CheckExists
4. 파일 다운로드 함수 : AmazonS3_Download
5. 파일 리스트 가져오는 함수 : AmazonS3_List_String    ( String 으로 리턴받을 경우)
6. 파일 리스트 가져오는 함수 : AmazonS3_List_StringList  ( StringList 를 이용할 경우)
    * 참고로 S3에서 파일 리스트를 리턴해 주는 파일 갯수가 1,000개까지입니다. 저의 경우는 S3 파일갯수가 1,000 개를 넘기 때문에,  S3에서 제공하는 인벤토리 레포트 기능을 활용하여 레포트 파일을 만들고, 그 파일을 가져와서 파싱하여 활용하고 있습니다.

=============================================================
1. 파일 업로드 함수 : AmazonS3_Upload :
    제가 이용하고 있는 파일들의 stContent_Type 종류는 다음과 같습니다.
        "image/jpeg"
        "image/png"
        "image/gif"
        "image/bmp"
        "text/plain"
        "application/pdf"
        "application/zip"
        "audio/mpeg"
//---------------------------------------------------------------------------
bool __fastcall TMainForm::AmazonS3_Upload(String stBucketName, String stActName, String stActKey, String stFileNameWithPath, String stContent_Type)
{
    String stDate, stFiles ;

    this->AmazonConnectionInfo1->AccountName = stActName ;
    this->AmazonConnectionInfo1->AccountKey  = stActKey ;

    try    {
        std::unique_ptr<TAmazonStorageService> s3(new TAmazonStorageService(AmazonConnectionInfo1));
        TCloudResponseInfo* resUpload_(new TCloudResponseInfo());
        std::unique_ptr<TMemoryStream> mm(new TMemoryStream());

        ///upload//
        mm->LoadFromFile( stFileNameWithPath );

        DynamicArray<Byte> arr1;
        arr1.Length     = mm->Size;
        mm->ReadBuffer(arr1, mm->Size);
        mm->Position     = 0;

        TStringList * stl_Header = new TStringList ;
        stl_Header->Values["Content-type"] = stContent_Type ; // "image/jpeg";
        s3->UploadObject(stBucketName, ExtractFileName(stFileNameWithPath), arr1, false, NULL, stl_Header, TAmazonACLType::amzbaPrivate, resUpload_);
        delete stl_Header ;
        ///upload end//

        delete resUpload_ ;

    } catch(...) {
        return false ;
    } ;

    return true ;
}

=============================================================
2. 파일 삭제 함수 : AmazonS3_Delete
//--------------------------------------------------------------------------
bool __fastcall TMainForm::AmazonS3_Delete(String stBucketName, String stActName, String stActKey, String stFileName)
{
    String stDate, stFiles ;

    this->AmazonConnectionInfo1->AccountName = stActName ;
    this->AmazonConnectionInfo1->AccountKey  = stActKey ;

    std::unique_ptr<TAmazonStorageService> s3(new TAmazonStorageService(AmazonConnectionInfo1));

    TCloudResponseInfo * resDelete_(new TCloudResponseInfo());
    try {
        ///Delete file//
        s3->DeleteObject(stBucketName, stFileName,    resDelete_);
        ///Delete file end//

    } catch(...) {
        delete resDelete_ ;
        return false ;
    } ;

    delete resDelete_ ;
    return true ;

}

=============================================================
3. 파일 존재 유무 확인 함수 : AmazonS3_CheckExists
//--------------------------------------------------------------------------
bool __fastcall TMainForm::AmazonS3_CheckExists(String stBucketName, String stActName, String stActKey, String stFileName)
{
    String stDate, stFiles ;

    this->AmazonConnectionInfo1->AccountName = stActName ;
    this->AmazonConnectionInfo1->AccountKey  = stActKey ;

    std::unique_ptr<TAmazonStorageService> s3(new TAmazonStorageService(AmazonConnectionInfo1));

    TCloudResponseInfo* resCheck_(new TCloudResponseInfo());
    try {
        std::unique_ptr<TMemoryStream> mm(new TMemoryStream());

        ///download///
        mm->Clear();
        TAmazonGetObjectOptionals* op_(new TAmazonGetObjectOptionals());
        if ( ! s3->GetObject( stBucketName, stFileName, mm.get(), resCheck_) ) {
            delete resCheck_ ;
            return false ;
        } ;
        ///download end///

    } catch(...) {
        delete resCheck_ ;
        return false ;
    } ;

    delete resCheck_ ;
    return true ;
}

=============================================================
4. 파일 다운로드 함수 : AmazonS3_Download
//--------------------------------------------------------------------------
bool __fastcall TMainForm::AmazonS3_Download(String stBucketName, String stActName, String stActKey, String stGetFileName, String stSaveFileNameWithPath)
{
    String stDate, stFiles ;

    this->AmazonConnectionInfo1->AccountName = stActName ;
    this->AmazonConnectionInfo1->AccountKey  = stActKey ;

    std::unique_ptr<TAmazonStorageService> s3(new TAmazonStorageService(AmazonConnectionInfo1));

    TCloudResponseInfo* resDownload_(new TCloudResponseInfo());
    try {
        std::unique_ptr<TMemoryStream> mm(new TMemoryStream());

        ///download///
        mm->Clear();
            TAmazonGetObjectOptionals* op_(new TAmazonGetObjectOptionals());
            s3->GetObject( stBucketName, stGetFileName, mm.get(), resDownload_);    // bool
        mm.get()->SaveToFile(stSaveFileNameWithPath);
        delete op_ ;
        ///download end///

    } catch(...) {
        delete resDownload_ ;
        return false ;
    } ;

    delete resDownload_ ;
    return true ;
}

=============================================================
5. 파일 리스트 가져오는 함수 : AmazonS3_List_String    ( String 으로 리턴받을 경우)
//---------------------------------------------------------------------------
/* 이용방법
    String stS3List ;

    stS3List = AmazonS3_List_String(stBucketName, stActName, stActKey, stl_list) ;
    ...
    ...
    ...
*/
//---------------------------------------------------------------------------
String __fastcall TMainForm::AmazonS3_List_String(String stBucketName, String stActName, String stActKey)
{
    String stFiles ;

    this->AmazonConnectionInfo1->AccountName = stActName ;
    this->AmazonConnectionInfo1->AccountKey  = stActKey ;

    std::unique_ptr<TStringList> listView_( new TStringList() ) ;
    std::unique_ptr<TAmazonStorageService> s3View(new TAmazonStorageService(AmazonConnectionInfo1));

    TCloudResponseInfo* resView_(new TCloudResponseInfo());
    TStringList * amzFileList = new TStringList ;

    amzFileList->Clear() ;
    stFiles = "" ;

    TAmazonBucketResult * bs = s3View->GetBucket(stBucketName, listView_.get(), resView_);

    for(int i = 0; i<bs->Objects->Count; i++) {
        amzFileList->Add(bs->Objects->Items[i].Name );
    } ;

    stFiles = amzFileList->Text ;

    delete resView_ ;
    delete amzFileList ;

    return stFiles ;
}

=============================================================
6. 파일 리스트 가져오는 함수 : AmazonS3_List_StringList  ( StringList 를 이용할 경우)
//---------------------------------------------------------------------------
/* 이용방법
    TStringList * stl_list = new TStringList ;
    stl_list->Clear() ;

    AmazonS3_List_StringList(stBucketName, stActName, stActKey, stl_list) ;

    for (int i = 0; i < stl_list->Count; i++) {
        ...
        ...
        ...
    } ;

    delete stl_list ;
*/
//---------------------------------------------------------------------------
void __fastcall TMainForm::AmazonS3_List_StringList(String stBucketName, String stActName, String stActKey, TStringList stl_list[])
{
    this->AmazonConnectionInfo1->AccountName = stActName ;
    this->AmazonConnectionInfo1->AccountKey  = stActKey ;

    std::unique_ptr<TStringList> listView_( new TStringList() ) ;
    std::unique_ptr<TAmazonStorageService> s3View(new TAmazonStorageService(AmazonConnectionInfo1));

    TCloudResponseInfo* resView_(new TCloudResponseInfo());
    TAmazonBucketResult * bs = s3View->GetBucket(stBucketName, listView_.get(), resView_);

    for(int i = 0; i<bs->Objects->Count; i++) {
        stl_list->Add(bs->Objects->Items[i].Name );
    } ;

    delete bs ;
    delete resView_ ;
    return ;
}


=============================================================
이상입니다.


+ -

관련 글 리스트
1192 아마존 S3 서비스 이용 함수 초행길 68 2024/05/08
Google
Copyright © 1999-2015, borlandforum.com. All right reserved.