原文: https://javatutorial.net/java-s3-example

在本教程中,我将解释如何通过 Amazon 提供的 Java API 使用 Amazon 的 S3 存储。 该示例说明了如何创建存储分区,列出存储分区的内容,在存储分区中创建文件夹,上传文件,为文件提供公共访问权限以及如何删除所有这些项目。

Java S3 示例 - 图2

设置项目

  1. 您将需要适用于 Java 的 AWS 开发工具包,此示例才能正常工作。 如果您现在尚未下载 SDK,请在此处下载。 您还需要将存档中的.JAR文件集成到您的项目中。 或者,您可以使用具有以下依赖项的 Maven
    1. <dependency>
    2. <groupId>com.amazonaws</groupId>
    3. <artifactId>aws-java-sdk</artifactId>
    4. <version>1.9.2</version>
    5. </dependency>
  1. 如果您没有,请在 Amazon IAM(https://console.aws.amazon.com/iam)中创建一个用户。 在这里您将获得一个“访问密钥”和“秘密访问密钥”。 您将需要此凭据才能连接到 S3。

  2. 将 IAM 中的“AWSConnector”和“ AmazonS3FullAccess”权限添加到新用户。 没有这个,您希望能够通过服务器进行身份验证。

使用 Amazon S3 进行身份验证

有 4 种不同的方法可针对 Amazon S3 验证您的请求

1. 使用默认的凭证配置文件 – 这是 Amazon 推荐的方法。 创建具有以下结构的文件并填写访问密钥:

  1. # Move this credentials file to (~/.aws/credentials)
  2. # after you fill in your access and secret keys in the default profile
  3. # WARNING: To avoid accidental leakage of your credentials,
  4. # DO NOT keep this file in your source directory.
  5. [default]
  6. aws_access_key_id=
  7. aws_secret_access_key=

默认情况下,将此文件保存为.aws文件夹中文件名credentials下的 Windows 用户或 Linux 中主目录的 C:\Users\user\.aws\credentials

如果使用此方法,则可以在代码中创建一个Credentials对象,如下所示:

  1. AWSCredentials credentials = new ProfileCredentialsProvider().getCredentials();

2. 使用环境变量 – 设置系统中以下环境变量的值。AWS_ACCESS_KEY_IDAWS_SECRET_ACCESS_KEY

3. Java 系统属性aws.accessKeyIdaws.secretKey。 使用SystemPropertiesCredentialsProvider在程序中加载变量

4. 以编程方式设置凭据 – 在此示例中,我将使用此方法,因为它更易于遵循

在代码中使用以下代码:

  1. AWSCredentials credentials = new BasicAWSCredentials("YourAccessKeyID", "YourSecretAccessKey");

创建 S3 客户端

为了能够与 S3 通信,您必须使用AmazonS3的实现。 您将使用实例来解决对服务器的请求

  1. AmazonS3 s3client = new AmazonS3Client(credentials);

创建桶

存储桶在整个 S3 领域中必须具有唯一的名称

  1. String bucketName = "javatutorial-net-example-bucket";
  2. s3client.createBucket(bucketName);

列出桶

您可以像这样从所有桶中获得列出

  1. for (Bucket bucket : s3client.listBuckets()) {
  2. System.out.println(" - " + bucket.getName());
  3. }

在 S3 存储桶中创建文件夹

使用此代码在存储桶中创建一个空文件夹

  1. public static void createFolder(String bucketName, String folderName, AmazonS3 client) {
  2. // create meta-data for your folder and set content-length to 0
  3. ObjectMetadata metadata = new ObjectMetadata();
  4. metadata.setContentLength(0);
  5. // create empty content
  6. InputStream emptyContent = new ByteArrayInputStream(new byte[0]);
  7. // create a PutObjectRequest passing the folder name suffixed by /
  8. PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,
  9. folderName + SUFFIX, emptyContent, metadata);
  10. // send request to S3 to create folder
  11. client.putObject(putObjectRequest);
  12. }

在 S3 中上传文件

如果要将文件上传到文件夹,请使用此

  1. String fileName = folderName + SUFFIX + "testvideo.mp4";
  2. s3client.putObject(new PutObjectRequest(bucketName, fileName,
  3. new File("C:\\Users\\user\\Desktop\\testvideo.mp4")));

只需删除文件名中的文件夹和后缀即可直接上传到存储桶。 如果要公开文件(Amazon S3 默认情况下文件为私有文件),请将其设置为PutObjectRequest(更多信息请参见下面的完整示例)

  1. .withCannedAcl(CannedAccessControlList.PublicRead)

删除文件,文件夹和存储桶

要删除存储桶,请使用此功能。 储存桶必须为空,否则您无法将其删除

  1. s3client.deleteBucket(bucketName);

要删除文件,请使用:

  1. s3client.deleteObject(bucketName, fileName);

要删除文件夹,您必须先删除其中的所有文件。 请查看下面的完整示例以获取更多信息。

完整的例子

在这里,您可以在一个工作程序中找到以上所有片段。 出于可读性的考虑,排除了异常处理,请不要忘记在代码中添加异常处理

  1. import java.io.ByteArrayInputStream;
  2. import java.io.File;
  3. import java.io.InputStream;
  4. import java.util.List;
  5. import com.amazonaws.auth.AWSCredentials;
  6. import com.amazonaws.auth.BasicAWSCredentials;
  7. import com.amazonaws.services.s3.AmazonS3;
  8. import com.amazonaws.services.s3.AmazonS3Client;
  9. import com.amazonaws.services.s3.model.Bucket;
  10. import com.amazonaws.services.s3.model.CannedAccessControlList;
  11. import com.amazonaws.services.s3.model.ObjectMetadata;
  12. import com.amazonaws.services.s3.model.PutObjectRequest;
  13. import com.amazonaws.services.s3.model.S3ObjectSummary;
  14. public class AmazonS3Example {
  15. private static final String SUFFIX = "/";
  16. public static void main(String[] args) {
  17. // credentials object identifying user for authentication
  18. // user must have AWSConnector and AmazonS3FullAccess for
  19. // this example to work
  20. AWSCredentials credentials = new BasicAWSCredentials(
  21. "YourAccessKeyID",
  22. "YourSecretAccessKey");
  23. // create a client connection based on credentials
  24. AmazonS3 s3client = new AmazonS3Client(credentials);
  25. // create bucket - name must be unique for all S3 users
  26. String bucketName = "javatutorial-net-example-bucket";
  27. s3client.createBucket(bucketName);
  28. // list buckets
  29. for (Bucket bucket : s3client.listBuckets()) {
  30. System.out.println(" - " + bucket.getName());
  31. }
  32. // create folder into bucket
  33. String folderName = "testfolder";
  34. createFolder(bucketName, folderName, s3client);
  35. // upload file to folder and set it to public
  36. String fileName = folderName + SUFFIX + "testvideo.mp4";
  37. s3client.putObject(new PutObjectRequest(bucketName, fileName,
  38. new File("C:\\Users\\user\\Desktop\\testvideo.mp4"))
  39. .withCannedAcl(CannedAccessControlList.PublicRead));
  40. deleteFolder(bucketName, folderName, s3client);
  41. // deletes bucket
  42. s3client.deleteBucket(bucketName);
  43. }
  44. public static void createFolder(String bucketName, String folderName, AmazonS3 client) {
  45. // create meta-data for your folder and set content-length to 0
  46. ObjectMetadata metadata = new ObjectMetadata();
  47. metadata.setContentLength(0);
  48. // create empty content
  49. InputStream emptyContent = new ByteArrayInputStream(new byte[0]);
  50. // create a PutObjectRequest passing the folder name suffixed by /
  51. PutObjectRequest putObjectRequest = new PutObjectRequest(bucketName,
  52. folderName + SUFFIX, emptyContent, metadata);
  53. // send request to S3 to create folder
  54. client.putObject(putObjectRequest);
  55. }
  56. /**
  57. * This method first deletes all the files in given folder and than the
  58. * folder itself
  59. */
  60. public static void deleteFolder(String bucketName, String folderName, AmazonS3 client) {
  61. List fileList =
  62. client.listObjects(bucketName, folderName).getObjectSummaries();
  63. for (S3ObjectSummary file : fileList) {
  64. client.deleteObject(bucketName, file.getKey());
  65. }
  66. client.deleteObject(bucketName, folderName);
  67. }
  68. }

如果您认为本教程有帮助,请查看我们的其他教程 - 我们确定您会在此页面上找到其他有趣的内容。 随时在“评论”部分中提问,或者通过共享本教程向我们展示一些爱意🙂