在本教程中,我将解释如何通过 Amazon 提供的 Java API 使用 Amazon 的 S3 存储。 该示例说明了如何创建存储分区,列出存储分区的内容,在存储分区中创建文件夹,上传文件,为文件提供公共访问权限以及如何删除所有这些项目。
设置项目
- 您将需要适用于 Java 的 AWS 开发工具包,此示例才能正常工作。 如果您现在尚未下载 SDK,请在此处下载。 您还需要将存档中的
.JAR
文件集成到您的项目中。 或者,您可以使用具有以下依赖项的 Maven<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.9.2</version>
</dependency>
如果您没有,请在 Amazon IAM(https://console.aws.amazon.com/iam)中创建一个用户。 在这里您将获得一个“访问密钥”和“秘密访问密钥”。 您将需要此凭据才能连接到 S3。
将 IAM 中的“AWSConnector”和“ AmazonS3FullAccess”权限添加到新用户。 没有这个,您希望能够通过服务器进行身份验证。
使用 Amazon S3 进行身份验证
有 4 种不同的方法可针对 Amazon S3 验证您的请求
1. 使用默认的凭证配置文件 – 这是 Amazon 推荐的方法。 创建具有以下结构的文件并填写访问密钥:
# 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
对象,如下所示:
AWSCredentials credentials = new ProfileCredentialsProvider().getCredentials();
2. 使用环境变量 – 设置系统中以下环境变量的值。AWS_ACCESS_KEY_ID
和AWS_SECRET_ACCESS_KEY
3. Java 系统属性 – aws.accessKeyId
和aws.secretKey
。 使用SystemPropertiesCredentialsProvider
在程序中加载变量
4. 以编程方式设置凭据 – 在此示例中,我将使用此方法,因为它更易于遵循
在代码中使用以下代码:
AWSCredentials credentials = new BasicAWSCredentials("YourAccessKeyID", "YourSecretAccessKey");
创建 S3 客户端
为了能够与 S3 通信,您必须使用AmazonS3
的实现。 您将使用实例来解决对服务器的请求
AmazonS3 s3client = new AmazonS3Client(credentials);
创建桶
存储桶在整个 S3 领域中必须具有唯一的名称
String bucketName = "javatutorial-net-example-bucket";
s3client.createBucket(bucketName);
列出桶
您可以像这样从所有桶中获得列出
for (Bucket bucket : s3client.listBuckets()) {
System.out.println(" - " + bucket.getName());
}
在 S3 存储桶中创建文件夹
使用此代码在存储桶中创建一个空文件夹
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 中上传文件
如果要将文件上传到文件夹,请使用此
String fileName = folderName + SUFFIX + "testvideo.mp4";
s3client.putObject(new PutObjectRequest(bucketName, fileName,
new File("C:\\Users\\user\\Desktop\\testvideo.mp4")));
只需删除文件名中的文件夹和后缀即可直接上传到存储桶。 如果要公开文件(Amazon S3 默认情况下文件为私有文件),请将其设置为PutObjectRequest
(更多信息请参见下面的完整示例)
.withCannedAcl(CannedAccessControlList.PublicRead)
删除文件,文件夹和存储桶
要删除存储桶,请使用此功能。 储存桶必须为空,否则您无法将其删除
s3client.deleteBucket(bucketName);
要删除文件,请使用:
s3client.deleteObject(bucketName, fileName);
要删除文件夹,您必须先删除其中的所有文件。 请查看下面的完整示例以获取更多信息。
完整的例子
在这里,您可以在一个工作程序中找到以上所有片段。 出于可读性的考虑,排除了异常处理,请不要忘记在代码中添加异常处理
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);
}
}
如果您认为本教程有帮助,请查看我们的其他教程 - 我们确定您会在此页面上找到其他有趣的内容。 随时在“评论”部分中提问,或者通过共享本教程向我们展示一些爱意🙂