说实话,对于中国人,用阿里云OSS等国内对象存储的解决方案肯定是最方便的,操作也很符合国人的操作习惯,但是有些时候,特殊情况,不得不用亚马逊云!
一、在亚马逊云S3创建一个存储桶,并设置权限
1、创建一个存储桶,并将权限设置为公开,因为我正常时候是用来存放网站图片:

2、配置存储卷策略:
{
"Version": "2012-10-17",
"Statement": [
{
"Sid": "PublicReadGetObject",
"Effect": "Allow",
"Principal": "*",
"Action": "s3:GetObject",
"Resource": "arn:aws:s3:::test.jiguiquan.com/*"
}
]
}

3、配置跨域策略:
[
{
"AllowedHeaders": [
"*"
],
"AllowedMethods": [
"PUT",
"POST",
"GET"
],
"AllowedOrigins": [
"*"
],
"ExposeHeaders": [
"x-amz-server-side-encryption",
"x-amz-request-id",
"x-amz-id-2"
],
"MaxAgeSeconds": 3000
}
]

到这里,存储卷的配置就算是OK啦,满足正常网站图片的使用了!
二、编写Java类,完成文件的上传
1、在项目中引入 aws-sdk 的依赖:
<dependency> <groupId>com.amazonaws</groupId> <artifactId>aws-java-sdk-s3</artifactId> <version>1.11.347</version> </dependency>
2、编写上传文件的接口:
@Api(tags = "Auth——第三方服务模块")
@RestController
@RequiredArgsConstructor
public class ThirdpartyController {
@Value("${s3.accessKeyId}")
private String s3AccessKeyId;
@Value("${s3.accessKeySecret}")
private String s3AccessKeySecret;
@Value("${s3.bucketName}")
private String s3BucketName;
@Value("${s3.region}")
private String s3Region;
private static BasicAWSCredentials awsCreds;
private static AmazonS3 s3;
@PostConstruct
private void init(){
awsCreds = new BasicAWSCredentials(s3AccessKeyId, s3AccessKeySecret);
s3 = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
//设置服务器所属地区
.withRegion(s3Region)
.build();
}
@ApiResponses({@ApiResponse(code = 200, message = "文件url")})
@ApiOperation("后端直接上传文件到亚马逊云S3")
@PostMapping("/auth/s3/upload")
public BaseResponse<String> uploadFileToS3(@RequestParam("file") MultipartFile file) {
if (file.getSize() == 0){
throw ZidanApiException.create(BmoonResponseCode.FILE_SIZE_ZERO);
}
if (StringUtils.isBlank(file.getOriginalFilename())){
throw ZidanApiException.create(BmoonResponseCode.FILE_NAME_EMPTY);
}
// String host = "https://s3." + s3Region + ".amazonaws.com/" + s3BucketName;
String host = "https://s3.ap-northeast-2.amazonaws.com/test.jiguiquan.com";
String format = new SimpleDateFormat("yyyyMMdd").format(new Date());
String uploadName = format + "/" + UUID.randomUUID().toString() + file.getOriginalFilename();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(file.getContentType());
metadata.setContentLength(file.getSize());
InputStream inputStream = null;
try {
inputStream = file.getInputStream();
com.amazonaws.services.s3.model.PutObjectResult result = s3.putObject(new PutObjectRequest(s3BucketName, uploadName, inputStream, metadata));
System.out.println(uploadName + ":文件的Md5为:" + result.getContentMd5());
return BaseResponse.success(host + "/" + uploadName);
}catch (Exception e) {
e.printStackTrace();
throw ZidanApiException.create(BmoonResponseCode.FILE_UPLOAD_FAILED);
} finally {
if (inputStream != null){
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
三、测试文件的上传与访问

浏览器访问:




