

适用于 Xamarin 的 AWS 移动 SDK 现已包含在。 适用于 .NET 的 AWS SDK本指南参考了适用于 Xamarin 的 Mobile SDK 的存档版本。

本文属于机器翻译版本。若本译文内容与英语原文存在差异，则一律以英文原文为准。

# 使用 Amazon S3 存储和检索文件
<a name="getting-started-store-retrieve-s3-transferutility"></a>

Amazon Simple Storage Service (Amazon S3) 为移动开发人员提供安全、持久、高度可扩展的对象存储。Amazon S3 易于使用，包含一个简单的 Web 服务界面，可从 Web 上的任何位置存储和检索任意数量的数据。

以下教程介绍了如何将 S3（一个用于将 S3 TransferUtility 与您的应用程序结合使用的高级实用程序）集成。有关从 Xamarin 应用程序使用 S3 的更多信息，请参阅 [Amazon Simple Storage Service (S3)](s3.md)。

## 项目设置
<a name="project-setup"></a>

### 先决条件
<a name="prerequisites"></a>

在开始本教程前，必须先完成有关[设置适用于 .NET 和 Xamarin 的 AWS Mobile SDK](setup.md) 的说明中的所有步骤。

本教程还假定您已创建 S3 存储桶。要创建 S3 存储桶，请访问 [S3 AWS 管理控制台](https://console.aws.amazon.com/s3/home)。

### 设置 S3 权限
<a name="set-permissions-for-s3"></a>

默认 IAM 角色策略会授予您的应用程序访问 Amazon Mobile Analytics 和 Amazon Cognito Sync 的权限。为了让您的 Cognito 身份池能够访问 Amazon S3，您必须修改身份池的角色。

1. 转至 [Identity and Access Management Console](https://console.aws.amazon.com/iam/home)，然后单击左窗格中的 **Roles**。

1. 在搜索框中键入您的身份池名称。将列出两个角色：一个用于未经身份验证的用户，另一个用于经过身份验证的用户。

1. 单击用于未经过身份验证的用户的角色 (身份池名称后附加有“unauth”)。

1. 单击 **Create Role Policy**，选择 **Policy Generator**，然后单击 **Select**。

1. 在**编辑权限**页面上，输入下图所示的设置，用您自己的资源名称替换 Amazon 资源名称 (ARN)。S3 存储桶的 ARN 类似 `arn:aws:s3:::examplebucket/*`，由存储桶所在的区域和存储桶的名称构成。下面显示的设置将赋予您的身份池对指定存储桶执行所有操作的完全访问权限。  
![\[Edit Permissions interface for AWS policy creation, showing options for Amazon S3 access control.\]](http://docs.aws.amazon.com/zh_cn/mobile/sdkforxamarin/developerguide/images/edit-permissions.png)

1. 单击 **Add Statement** 按钮，然后单击 **Next Step**。

1. 向导将向您显示生成的配置。单击**应用策略**。

有关授予访问 S3 的权限的更多信息，请参阅[授予访问 Amazon S3 存储桶的权限](http://blogs.aws.amazon.com/security/post/Tx3VRSWZ6B3SHAV/Writing-IAM-Policies-How-to-grant-access-to-an-Amazon-S3-bucket)。

### 将 Pac NuGet kage for S3 添加到您的项目中
<a name="add-nuget-package-for-s3-to-your-project"></a>

按照[设置适用于.NET 和 Xamarin 的 AWS 移动软件开发工具](setup.md)包中说明的第 4 步，将 NuGet S3 软件包添加到您的项目中。

### (可选) 配置针对 S3 请求的签名版本
<a name="optional-configure-the-signature-version-for-s3-requests"></a>

与 Amazon S3 的每一次交互都是经身份验证的或匿名的。AWS 使用签名版本 4 或签名版本 2 算法来对服务调用进行身份验证。

2014 年 1 月之后创建的所有新的 AWS 区域仅支持签名版本 4。但是，许多较旧的区域仍支持签名版本 4 和签名版本 2 请求。

如果您的存储桶位于不支持[本页](https://docs.aws.amazon.com/general/latest/gr/signature-version-2.html)所列签名版本 2 请求的区域之一，则必须设置 AWSConfigs S3。 UseSignatureVersion4 个属性变成 “true”，如下所示：

```
AWSConfigsS3.UseSignatureVersion4 = true;
```

有关 AWS 签名版本的更多信息，请参阅[对请求进行身份验证（AWS 签名版本 4）](https://docs.aws.amazon.com/AmazonS3/latest/API/sig-v4-authenticating-requests.html)。

## 初始化 S3 TransferUtility 客户端
<a name="initialize-the-s3-transferutility-client"></a>

创建 S3 客户端，将其传递给您的 AWS 凭证对象，然后将 S3 客户端传递到 Transfer Utility，如下所示：

```
var s3Client = new AmazonS3Client(credentials,region);
var transferUtility = new TransferUtility(s3Client);
```

## 将文件上传到 Amazon S3
<a name="upload-a-file-to-amazon-s3"></a>

要将文件上传到 S3，请对 Transfer Utility 对象调用 `Upload`，并传递下列参数：
+  `file` – 要上传的文件的名称 (字符串)
+  `bucketName` – 用来存储文件的 S3 存储桶的字符串名称

```
transferUtility.Upload(
  Path.Combine(Environment.SpecialFolder.ApplicationData,"file"),
  "bucketName"
);
```

上面的代码假设 “环境” 目录中有一个文件。 SpecialFolder。 ApplicationData。上传操作将自动对大文件使用 S3 的多分段上传功能以增强吞吐量。

## 从 Amazon S3 下载文件
<a name="download-a-file-from-amazon-s3"></a>

要从 S3 下载文件，请对 Transfer Utility 对象调用 `Download`，并传递下列参数：
+  `file` – 要下载的文件的名称 (字符串)
+  `bucketName` – 要从中下载文件的 S3 存储桶的字符串名称
+  `key` – 代表要下载的 S3 对象 (这里为一个文件) 名称的字符串

```
transferUtility.Download(
  Path.Combine(Environment.SpecialFolder.ApplicationData,"file"),
  "bucketName",
  "key"
);
```

有关从 Xamarin 应用程序访问 Amazon S3 的更多信息，请参阅 [Amazon Simple Storage Service (S3)](s3.md)。