Amazon Simple Storage Service (S3) - AWSMobile SDK for Unity

所以此AWS適用於 Unity 的 Mobile SDK 現已包含在AWS SDK for .NET。本指南引用適用於 Unity 的 Mobile SDK 的存檔版本。如需詳細資訊,請參閱「」什麼是AWS適用於 Unity 的 Mobile SDK?

本文為英文版的機器翻譯版本,如內容有任何歧義或不一致之處,概以英文版為準。

Amazon Simple Storage Service (S3)

Amazon Simple Storage Service (Amazon S3) 為開發人員和 IT 團隊提供安全、耐用、高可擴展性的對象儲存空間。Unity 開發人員可以利用 S3 動態加載遊戲使用的資產。這可以使遊戲最初從應用商店下載速度更快。

如需 S3 的詳細資訊,請參Amazon S3

如需 AWS S3 區域可用性的資訊,請參AWS 服務區域可用性

注意

本文檔中的一些示例假定使用了名為ResultText以顯示跟蹤輸出。

建立和配置 S3 儲存貯體

Amazon S3 將您的資源存儲在 Amazon S3 存儲桶中-存儲在特定區域。每個 Amazon S3 儲存貯體都必須具有全域唯一的名稱。您可以使用Amazon S3 主控台建立儲存貯體。

建立 S3 儲存貯體

  1. 登入Amazon S3 主控台,然後按一下建立儲存貯體

  2. 輸入儲存貯體名稱,選取區域,然後按一下建立

設定 S3 的許可

默認 IAM 角色政策授予您的應用程序訪問 Amazon Mobile Analytics 和 Amazon Cognito Sync 的權限。要使您的 Cognito 身份池能夠訪問 Amazon S3,您必須修改身份池的角色。

  1. 前往Identity and Access Management Console,然後按一下角色在左側窗格中。

  2. 在搜尋方塊中輸入您的身分集區名稱。將會列出兩個角色:一個用於未經驗證的使用者,另一個用於通過驗證的使用者。

  3. 按一下未經驗證用户的角色 (它會在您的身份池名稱後附加非授權)。

  4. 按一下建立角色政策中,選取政策產生器,然後按一下選擇

  5. 編輯許可頁面上,輸入以下圖片中顯示的設定,將 Amazon Resource Name (ARN) 替換為您自己的資源名稱 (ARN)。S3 儲存貯體的 ARN 如下所示arn:aws:s3:::examplebucket/*並由儲存貯體所在的區域和儲存貯體的名稱組成。下面顯示的設置將為您的身份池提供完全訪問指定存儲桶的所有操作。

    Edit Permissions interface for AWS policy creation, showing options for Amazon S3 access control.
  1. 按一下新增陳述式按鈕,然後單擊後續步驟

  2. 嚮導會顯示您產生的設定。按一下應用政策

如需授予 S3 訪問權的詳細資訊,請參授予 Amazon S3 儲存貯體的存取權

從控制台上傳文件

將測試文件上傳至儲存貯體:

  1. 在 S3 控制台中的存儲桶視圖中,單擊上傳

  2. 按一下新增檔案,然後選擇要上傳的測試文件。在本教程中,我們假設您正在上傳一個名為myImage.jpg

  3. 選擇測試圖像後,單擊開始上傳

(可選)配置 S3 請求的簽名版本

與 Amazon S3 的每次互動,可以經過驗證身份或是匿名進行。AWS 使用簽名版本 4 或簽名版本 2 算法對服務的調用進行身份驗證。

2014 年 1 月之後創建的所有新 AWS 區域僅支持簽名版本 4。但是,許多較舊的區域仍然支援 Signature 第 4 版和 Signature 第 2 版請求。

如果您的存儲桶位於不支持簽名版本 2 請求的區域之一,如此頁面時,您必須設定AWSConfigsS3.UseSignature版本 4 屬性設置為「true」。

如需 AWS Signature 版本的詳細資訊,請參驗證請求(AWS Signature 第 4 版)

建立 Amazon S3 用户端

要使用 Amazon S3,我們首先需要創建一個亞馬遜 3 客户端實例,該實例需要引用 CognitoAWSCredentials實例:

AmazonS3Client S3Client = new AmazonS3Client (credentials);

所以此AmazonS3Client類別是高級 S3 API 的進入點。

列出儲存貯體

要列出 AWS 賬户中的存儲桶,請調用AmazonS3Client.ListBucketsAsync方法,如下列程式碼所示:

// ResultText is a label used for displaying status information ResultText.text = "Fetching all the Buckets"; Client.ListBucketsAsync(new ListBucketsRequest(), (responseObject) => { ResultText.text += "\n"; if (responseObject.Exception == null) { ResultText.text += "Got Response \nPrinting now \n"; responseObject.Response.Buckets.ForEach((s3b) => { ResultText.text += string.Format("bucket = {0}, created date = {1} \n", s3b.BucketName, s3b.CreationDate); }); } else { ResultText.text += "Got Exception \n"; } });

列出物件

要列出存儲桶中的所有對象,請調用AmazonS3Client.ListObjectsAsync方法,如下列程式碼所示:

// ResultText is a label used for displaying status information ResultText.text = "Fetching all the Objects from " + S3BucketName; var request = new ListObjectsRequest() { BucketName = S3BucketName }; Client.ListObjectsAsync(request, (responseObject) => { ResultText.text += "\n"; if (responseObject.Exception == null) { ResultText.text += "Got Response \nPrinting now \n"; responseObject.Response.S3Objects.ForEach((o) => { ResultText.text += string.Format("{0}\n", o.Key); }); } else { ResultText.text += "Got Exception \n"; } });

下載物件

若要下載物件,請建立GetObject請求,指定存儲桶名稱和密鑰,並將對象傳遞給客户端的調用。GetObject非同步:

private void GetObject() { ResultText.text = string.Format("fetching {0} from bucket {1}", SampleFileName, S3BucketName); Client.GetObjectAsync(S3BucketName, SampleFileName, (responseObj) => { string data = null; var response = responseObj.Response; if (response.ResponseStream != null) { using (StreamReader reader = new StreamReader(response.ResponseStream)) { data = reader.ReadToEnd(); } ResultText.text += "\n"; ResultText.text += data; } }); }

GetObject異步採用GetObject請求、回調和AsyncOptions實例。回調必須為以下類型:AmazonServiceCallback<GetObjectRequest, GetObjectResponse>。 所以此AsyncOptions實例是可選的。如果指定,它將確定回調是否在主線程上運行。

上傳物件

要上傳對象,請將對象寫入流,創建一個新的PostObject請求並指定密鑰、存儲桶名稱和流數據。

適用於 Unity 的 AWS 開發工具包使用不支持 HTTP PUT 操作的 WWW HTTP 客户端。要將數據元上傳到 S3 存儲桶,您需要使用 S3 的瀏覽器帖子,如下所示。

public void PostObject(string fileName) { ResultText.text = "Retrieving the file"; var stream = new FileStream(Application.persistentDataPath + Path.DirectorySeparatorChar + fileName, FileMode.Open, FileAccess.Read, FileShare.Read); ResultText.text += "\nCreating request object"; var request = new PostObjectRequest() { Bucket = S3BucketName, Key = fileName, InputStream = stream, CannedACL = S3CannedACL.Private }; ResultText.text += "\nMaking HTTP post call"; Client.PostObjectAsync(request, (responseObj) => { if (responseObj.Exception == null) { ResultText.text += string.Format("\nobject {0} posted to bucket {1}", responseObj.Request.Key, responseObj.Request.Bucket); } else { ResultText.text += "\nException while posting the result object"; ResultText.text += string.Format("\n receieved error {0}", responseObj.Response.HttpStatusCode.ToString()); } }); }