2021/2/2 使用亚马逊 AWS S3进行文件存储
Amazon Web Services
AWS - 亚马逊公司旗下云计算服务平台,为世界各地的客户提供一整套基础设施和云解决方案. AWS面向用户提供整套云计算服务,能够帮助企业降低IT投入成本和维护成本, 轻松上云.
springboot简单整合S3文件上传
S3的pom文件
<dependency>
<groupId>com.amazonaws</groupId>
<artifactId>aws-java-sdk-s3</artifactId>
<version>1.11.233</version>
</dependency>
<dependency>
<groupId>software.amazon.awssdk</groupId>
<artifactId>s3</artifactId>
<version>2.13.63</version>
</dependency>
项目中使用S3,需要我们提供几个参数
例如:
//accessKeyID
public static String accessKeyID ="xxxxxxxx";
//secretKey
public static String secretKey = "xxxxxxxx";
//S3上桶的名称
public static String bucketName = "xxxxxxxx";
//所属地区
public static String region = "xxxxxxxx";
基本上得到这四个参数就可以进行S3的一些操作了。
参数获取:
1.从页面中直接读取
2.从链接中拿到
* 格式: https://桶名 .s3-你的Region名称.amazonaws.com
* 示例: https://xxton.s3-cn-north-1.amazonaws.com
S3文件存储操作
工具类1
/**
* 创建访问凭证对象
*/
private static final BasicAWSCredentials awsCreds = new BasicAWSCredentials(ACCESS_KEY, SECRET_KEY);
/**
* 创建s3对象
*/
private static final AmazonS3 s3 = AmazonS3ClientBuilder.standard()
.withCredentials(new AWSStaticCredentialsProvider(awsCreds))
//设置服务器所属地区
.withRegion(Regions.CN_NORTHWEST_1)
.build();
/**
* 上传文件示例
*
* @param uploadPath 上传路径
*/
private static String uploadFile(File file, String uploadPath) {
try {
if (file == null) {
return null;
}
//设置文件目录
if(StringUtils.isNotEmpty(uploadPath)){
uploadPath= "/".equals(uploadPath.substring(uploadPath.length()-1))?uploadPath:uploadPath+"/";
}else{
uploadPath="default/";
}
//生成随机文件名
String expandedName= file.getName().substring(file.getName().lastIndexOf("."));
String key = uploadPath + UUID.randomUUID().toString() +expandedName;
// 设置文件上传对象
PutObjectRequest request = new PutObjectRequest(BUCKET_NAME, key, file);
// 设置公共读取
request.withCannedAcl(CannedAccessControlList.PublicRead);
// 上传文件
PutObjectResult putObjectResult = s3.putObject(request);
if (null != putObjectResult) {
return key;
}
return null;
} catch (Exception e) {
e.printStackTrace();
}
return null;
}
/**
* 获取文件下载路径
* @param key 文件的key
* @return
*/
private static String downloadFile(String key){
try {
if(StringUtils.isEmpty(key)){
return null;
}
GeneratePresignedUrlRequest httpRequest = new GeneratePresignedUrlRequest(BUCKET_NAME, key);
return s3.generatePresignedUrl(httpRequest).toString();
}catch (Exception e){
e.printStackTrace();
}
return null;
}
工具类2
//S3文件上传方法
public static String S3upload(MultipartFile multipartFile){
String localFileName;
String originalFilename = multipartFile.getOriginalFilename();
if (multipartFile.isEmpty()) {
return "上传文件不能为空";
}
if(StringUtils.isEmpty(originalFilename)){
localFileName = UUID.randomUUID() + "." + multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".") + 1)+"xlsx";
}else{
//生成随机文件名 localFileName
localFileName = UUID.randomUUID() + "." + multipartFile.getOriginalFilename().substring(multipartFile.getOriginalFilename().lastIndexOf(".") + 1);
}
Date date = new Date();
SimpleDateFormat formatter_yyyy = new SimpleDateFormat("yyyy");
SimpleDateFormat formatter_MM = new SimpleDateFormat("MM");
//在随机名前加上年月
String s3FileFullPath = formatter_yyyy.format(date) + "/" + formatter_MM.format(date) + "/" + localFileName;
//获取S3Client对象
AWSCredentials awsCredentials = new BasicAWSCredentials(accessKeyID, secretKey);
AmazonS3ClientBuilder builder = AmazonS3ClientBuilder.standard().withCredentials(new AWSStaticCredentialsProvider(awsCredentials));
builder.setRegion(region);
AmazonS3 s3Client = builder.build();
ObjectMetadata metadata = new ObjectMetadata();
metadata.setContentType(multipartFile.getContentType());
metadata.setContentLength(multipartFile.getSize());
try {
//开始上传文件
//s3FileFullPath作为该文件的唯一标识符key
PutObjectResult putResult = s3Client.putObject(bucketName, s3FileFullPath, multipartFile.getInputStream(), metadata);
System.out.println("【流方式】上传MumbaiS3完成,md5:" + putResult.getETag() + ",S3文件:" + s3FileFullPath);
} catch (Exception e) {
e.printStackTrace();
}
//返回文件在S3上的key
return s3FileFullPath;
}
//S3文件下载方法
public static void S3Download(AmazonS3 s3Client,String bucketName,String key,String targetFilePath){
//获取S3Client对象
S3Object object = s3Client.getObject(new GetObjectRequest(bucketName,key));
if(object!=null){
System.out.println("Content-Type: " +object.getObjectMetadata().getContentType());
InputStream input = null;
FileOutputStream fileOutputStream = null;
byte[] data = null;
try {
//获取文件流
input=object.getObjectContent();
data = new byte[input.available()];
int len = 0;
fileOutputStream = new FileOutputStream(targetFilePath);
while ((len = input.read(data)) != -1) {
fileOutputStream.write(data, 0, len);
}
System.out.println("下载文件成功");
} catch (IOException e) {
e.printStackTrace();
}finally{
if(fileOutputStream!=null){
try {
fileOutputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if(input!=null){
try {
input.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}