最近公司用到亚马逊 s3文件服务器,在这里记录一下其使用过程。
1.AWS的创建和访问密钥,凭证的获取
在Java服务端中使用AWS SDK for Java前需要为它提供凭证,凭证从AWS个人账户中生成,每页账户的话,打开 AWS云服务进行注册,新增IAM用户并创建密钥。
详情请见[https://docs.aws.amazon.com/zh_cn/sdk-for-java/v1/developer-guide/signup-create-iam-user.html]
2.AWS SDK for Java的使用
POM中导入相关依赖
<!-- https://mvnrepository.com/artifact/com.amazonaws/aws-java-sdk -->
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk</artifactId>
<version>1.11.393</version>
</dependency>
yaml配置文件中进行相应参数的配置,使用@Value注解获取数据
application.yml
AwsUtils.java
注意这里如果使用@value注解获取ymal中参数时,需要在类名前加@Component,调用该类时也需要使用@Autowired方式进行注入,而非new一个对象。
文件上传的实现:
public AmazonS3 getS3() {
AmazonS3 amazonS3 = new AmazonS3Client(new BasicAWSCredentials(this.AWS_ACCESS_KEY, this.AWS_SECRET_KEY));
Region usWest2 = Region.getRegion(Regions.CN_NORTH_1);
amazonS3.setRegion(usWest2);
amazonS3.setEndpoint(this.ENDPOINT);
return amazonS3;
}
/**
* @param @param tempFile 目标文件
* @param @param remoteFileName 文件名
* @param @return
* @param @throws IOException 设定文件
* @return String 返回类型
* @throws
* @Title: uploadToS3
* @Description: 将文件上传至S3上并且返回url
*/
public String uploadToS3(MultipartFile tempFile,String remoteFileName) throws IOException {
s3 = getS3();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(tempFile.getContentType());
metadata.setContentLength(tempFile.getSize());
String type = tempFile.getContentType().split("/")[0];
remoteFileName = type+"/"+remoteFileName; //通过getContentType()获取文件类型并按照类型自动存放到相应文件夹中
try {
//上传文件
s3.putObject(new PutObjectRequest(BUCKET_NAME,remoteFileName,tempFile.getInputStream(),metadata).withCannedAcl(CannedAccessControlList.PublicRead));
//获取一个request
GeneratePresignedUrlRequest urlRequest = new GeneratePresignedUrlRequest(
BUCKET_NAME, remoteFileName);
//生成公用的url
URL url = s3.generatePresignedUrl(urlRequest);
System.out.println("URL:" + url);
return url.toString();
} catch (AmazonServiceException ase) {
ase.printStackTrace();
} catch (AmazonClientException ace) {
ace.printStackTrace();
}
return null;
}
/**
* c查找s3上名称为bucketName的Bucket里的所有对象
*
* @param amazonS3
* @param bucketName
* @return
*/
public void getObjectList(){
s3 = getS3();
try{
ObjectListing ol = s3.listObjects(BUCKET_NAME);
List<S3ObjectSummary> objects = ol.getObjectSummaries();
for (S3ObjectSummary os: objects) {
System.out.println("* " + os.getKey());
}
}catch (Exception e){
e.printStackTrace();
}
}
S3的中文说明文档在这里Amazon S3,记录一下,以后慢慢消化。
网友评论