# Java S3 示例 > 原文: [https://javatutorial.net/java-s3-example](https://javatutorial.net/java-s3-example) 在本教程中,我将解释如何通过 Amazon 提供的 Java API 使用 Amazon 的 S3 存储。 该示例说明了如何创建存储分区,列出存储分区的内容,在存储分区中创建文件夹,上传文件,为文件提供公共访问权限以及如何删除所有这些项目。 ## ![amazon s3 java example](img/322e95f01db737d45653551a3bea1f62.jpg) ## 设置项目 1. 您将需要适用于 Java 的 AWS 开发工具包,此示例才能正常工作。 如果您现在尚未下载 SDK,[请在此处下载](http://aws.amazon.com/sdk-for-java/)。 您还需要将存档中的`.JAR`文件集成到您的项目中。 或者,您可以使用具有以下依赖项的 Maven ```java com.amazonaws aws-java-sdk 1.9.2 ``` 2. 如果您没有,请在 Amazon IAM(https://console.aws.amazon.com/iam)中创建一个用户。 在这里您将获得一个“访问密钥”和“秘密访问密钥”。 您将需要此凭据才能连接到 S3。 3. 将 IAM 中的“AWSConnector”和“ AmazonS3FullAccess”权限添加到新用户。 没有这个,您希望能够通过服务器进行身份验证。 ## 使用 Amazon S3 进行身份验证 有 4 种不同的方法可针对 Amazon S3 验证您的请求 **1\. 使用默认的凭证配置文件** – 这是 Amazon 推荐的方法。 创建具有以下结构的文件并填写访问密钥: ```java # Move this credentials file to (~/.aws/credentials) # after you fill in your access and secret keys in the default profile # WARNING: To avoid accidental leakage of your credentials, # DO NOT keep this file in your source directory. [default] aws_access_key_id= aws_secret_access_key= ``` 默认情况下,将此文件保存为`.aws`文件夹中文件名`credentials`下的 Windows 用户或 Linux 中主目录的 `C:\Users\user\.aws\credentials` 如果使用此方法,则可以在代码中创建一个`Credentials`对象,如下所示: ```java AWSCredentials credentials = new ProfileCredentialsProvider().getCredentials(); ``` **2\. 使用环境变量** – 设置系统中以下环境变量的值。`AWS_ACCESS_KEY_ID`和`AWS_SECRET_ACCESS_KEY` **3\. Java 系统属性** – `aws.accessKeyId`和`aws.secretKey`。 使用`SystemPropertiesCredentialsProvider`在程序中加载变量 **4\. 以编程方式设置凭据** – 在此示例中,我将使用此方法,因为它更易于遵循 在代码中使用以下代码: ```java AWSCredentials credentials = new BasicAWSCredentials("YourAccessKeyID", "YourSecretAccessKey"); ``` ## 创建 S3 客户端 为了能够与 S3 通信,您必须使用`AmazonS3`的实现。 您将使用实例来解决对服务器的请求 ```java AmazonS3 s3client = new AmazonS3Client(credentials); ``` ## 创建桶 存储桶在整个 S3 领域中必须具有唯一的名称 ```java String bucketName = "javatutorial-net-example-bucket"; s3client.createBucket(bucketName); ``` ## 列出桶 您可以像这样从所有桶中获得列出 ```java for (Bucket bucket : s3client.listBuckets()) { System.out.println(" - " + bucket.getName()); } ``` ## 在 S3 存储桶中创建文件夹 使用此代码在存储桶中创建一个空文件夹 ```java public static void createFolder(String bucketName, String folderName, AmazonS3 client) { // create meta-data for your folder and set content-length to 0 ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentLength(0); // create empty content InputStream emptyContent = new ByteArrayInputStream(new byte[0]); // create a PutObjectRequest passing the folder name suffixed by / PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, folderName + SUFFIX, emptyContent, metadata); // send request to S3 to create folder client.putObject(putObjectRequest); } ``` ## 在 S3 中上传文件 如果要将文件上传到文件夹,请使用此 ```java String fileName = folderName + SUFFIX + "testvideo.mp4"; s3client.putObject(new PutObjectRequest(bucketName, fileName, new File("C:\\Users\\user\\Desktop\\testvideo.mp4"))); ``` 只需删除文件名中的文件夹和后缀即可直接上传到存储桶。 如果要公开文件(Amazon S3 默认情况下文件为私有文件),请将其设置为`PutObjectRequest`(更多信息请参见下面的完整示例) ```java .withCannedAcl(CannedAccessControlList.PublicRead) ``` ## 删除文件,文件夹和存储桶 要删除存储桶,请使用此功能。 储存桶必须为空,否则您无法将其删除 ```java s3client.deleteBucket(bucketName); ``` 要删除文件,请使用: ```java s3client.deleteObject(bucketName, fileName); ``` 要删除文件夹,您必须先删除其中的所有文件。 请查看下面的完整示例以获取更多信息。 ## 完整的例子 在这里,您可以在一个工作程序中找到以上所有片段。 出于可读性的考虑,排除了异常处理,请不要忘记在代码中添加异常处理 ```java import java.io.ByteArrayInputStream; import java.io.File; import java.io.InputStream; import java.util.List; import com.amazonaws.auth.AWSCredentials; import com.amazonaws.auth.BasicAWSCredentials; import com.amazonaws.services.s3.AmazonS3; import com.amazonaws.services.s3.AmazonS3Client; import com.amazonaws.services.s3.model.Bucket; import com.amazonaws.services.s3.model.CannedAccessControlList; import com.amazonaws.services.s3.model.ObjectMetadata; import com.amazonaws.services.s3.model.PutObjectRequest; import com.amazonaws.services.s3.model.S3ObjectSummary; public class AmazonS3Example { private static final String SUFFIX = "/"; public static void main(String[] args) { // credentials object identifying user for authentication // user must have AWSConnector and AmazonS3FullAccess for // this example to work AWSCredentials credentials = new BasicAWSCredentials( "YourAccessKeyID", "YourSecretAccessKey"); // create a client connection based on credentials AmazonS3 s3client = new AmazonS3Client(credentials); // create bucket - name must be unique for all S3 users String bucketName = "javatutorial-net-example-bucket"; s3client.createBucket(bucketName); // list buckets for (Bucket bucket : s3client.listBuckets()) { System.out.println(" - " + bucket.getName()); } // create folder into bucket String folderName = "testfolder"; createFolder(bucketName, folderName, s3client); // upload file to folder and set it to public String fileName = folderName + SUFFIX + "testvideo.mp4"; s3client.putObject(new PutObjectRequest(bucketName, fileName, new File("C:\\Users\\user\\Desktop\\testvideo.mp4")) .withCannedAcl(CannedAccessControlList.PublicRead)); deleteFolder(bucketName, folderName, s3client); // deletes bucket s3client.deleteBucket(bucketName); } public static void createFolder(String bucketName, String folderName, AmazonS3 client) { // create meta-data for your folder and set content-length to 0 ObjectMetadata metadata = new ObjectMetadata(); metadata.setContentLength(0); // create empty content InputStream emptyContent = new ByteArrayInputStream(new byte[0]); // create a PutObjectRequest passing the folder name suffixed by / PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName, folderName + SUFFIX, emptyContent, metadata); // send request to S3 to create folder client.putObject(putObjectRequest); } /** * This method first deletes all the files in given folder and than the * folder itself */ public static void deleteFolder(String bucketName, String folderName, AmazonS3 client) { List fileList = client.listObjects(bucketName, folderName).getObjectSummaries(); for (S3ObjectSummary file : fileList) { client.deleteObject(bucketName, file.getKey()); } client.deleteObject(bucketName, folderName); } } ``` 如果您认为本教程有帮助,请查看我们的其他教程 - 我们确定您会在此页面上找到其他有趣的内容。 随时在“评论”部分中提问,或者通过共享本教程向我们展示一些爱意🙂