阿里云OSS多文件文件上传删除
一、注册阿里云账户并开启OSS功能并创建对应的桶和获取对应的密钥
步骤: 略
二、在项目中添加对应的pom依赖
<dependency>
<groupId>com.aliyun.oss</groupId>
<artifactId>aliyun-sdk-oss</artifactId>
<version>3.12.0</version>
</dependency>
三、我这边写的是从properties中定义对应的值
四 、创建对应的工具类
@Component
@Slf4j
public class OssUploadUtil {
@Value("${access-key}")
private String accessKey;
@Value("${secret-key}")
private String secretKey;
@Value("${bucket-name}")
private String bucket;
@Value("${endpoint}")
private String endPointUrl;
@Value("${savePath}")
private String savePath;
/**
* oss文件上传实例
* @param multipartFile
* @return
*/
public String upload(MultipartFile[] multipartFile){
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。关于其他Region对应的Endpoint信息,请参见访问域名和数据中心。
String endpoint = endPointUrl;
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = accessKey;
String accessKeySecret = secretKey;
// 填写Bucket名称,例如examplebucket。
String bucketName = bucket;
//保存文件夹
String path = savePath;
//多文件路径地址
StringBuilder multiUrl = new StringBuilder();
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
for (MultipartFile file : multipartFile) {
InputStream inputStream = file.getInputStream();
//获取文件名
String objectName = file.getOriginalFilename();
String filename = UUID.randomUUID().toString();
String suffix = objectName.substring(objectName.lastIndexOf("."));
//获取文件类型
String contentType = getContentType(suffix);
//设置文件类型
ObjectMetadata objectMetadata = new ObjectMetadata();
objectMetadata.setContentType(contentType);
String newName = filename+suffix;
log.info("存入文件:{}",newName);
String fileUrl = path +"/"+newName;
ossClient.putObject(bucketName, fileUrl, inputStream,contentType == null?null:objectMetadata);
multiUrl.append("https://").append(bucketName).append(".").append(endpoint).append("/").append(fileUrl).append(",");
}
return multiUrl.substring(0,multiUrl.length()-1);
} catch (OSSException oe) {
log.error("Caught an OSSException, which means your request made it to OSS, "
+ "but was rejected with an error response for some reason.");
log.error("Error Message:" + oe.getErrorMessage());
log.error("Error Code:" + oe.getErrorCode());
log.error("Request ID:" + oe.getRequestId());
log.error("Host ID:" + oe.getHostId());
return "fail";
} catch (Exception ce) {
log.error("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
log.error("Error Message:" + ce.getMessage());
return "fail";
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
//删除文件
public void deleteFile(String urls) {
// Endpoint以华东1(杭州)为例,其它Region请按实际情况填写。关于其他Region对应的Endpoint信息,请参见访问域名和数据中心。
String endpoint = endPointUrl;
// 阿里云账号AccessKey拥有所有API的访问权限,风险很高。强烈建议您创建并使用RAM用户进行API访问或日常运维,请登录RAM控制台创建RAM用户。
String accessKeyId = accessKey;
String accessKeySecret = secretKey;
// 填写Bucket名称,例如examplebucket。
String bucketName = bucket;
String[] urlArray = urls.split(",");
// 创建OSSClient实例。
OSS ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
try {
for (String url : urlArray) {
String replaceUrl = savePath+url.substring(url.lastIndexOf("/"));
boolean exist = ossClient.doesObjectExist(bucketName, replaceUrl);
if (!exist){
log.info("该文件 {} 不存在",url);
continue;
}
ossClient.deleteObject(bucketName, replaceUrl);
log.info("该文件 {} 已删除",url);
}
}catch (Exception ce) {
log.error("Caught an ClientException, which means the client encountered "
+ "a serious internal problem while trying to communicate with OSS, "
+ "such as not being able to access the network.");
log.error("Error Message:" + ce.getMessage());
} finally {
if (ossClient != null) {
ossClient.shutdown();
}
}
}
public static String getContentType(String FilenameExtension) {
if (FilenameExtension.equalsIgnoreCase(".bmp")) {
return "image/bmp";
}
if (FilenameExtension.equalsIgnoreCase(".gif")) {
return "image/gif";
}
if (FilenameExtension.equalsIgnoreCase(".jpeg") ||
FilenameExtension.equalsIgnoreCase(".jpg") ||
FilenameExtension.equalsIgnoreCase(".png")) {
return "image/jpg";
}
return null;
}
}
五、使用举例
① 增加场景使用
public void addNurseryManage(NurseryManageAddFo nurseryManageAddFo) {
//获取文件
MultipartFile[] multipartFile = nurseryManageAddFo.getMultipartFile();
//判断文件是否为空
if (multipartFile != null && !multipartFile[0].isEmpty()){
//获取返回的对文件路径,以逗号分隔
String url = ossUploadUtil.upload(multipartFile);
//存入数据中
nurseryManageAddFo.setFileUrl(url);
}
try {
NurseryManage nurseryManage = nurseryManageConverter.from(nurseryManageAddFo);
nurseryManageMysqlDao.insert(nurseryManage);
} catch (Exception e) {
log.info("增加数据失败,删除已添加的文件");
//如果出现添加数据库失败,则删除存在到oss的文件
if (nurseryManageAddFo.getFileUrl()!=null) ossUploadUtil.deleteFile(nurseryManageAddFo.getFileUrl());
//继续抛异常防止不能回滚
throw e;
}
}
② 更新场景使用
public Boolean updateNurseryManageById(NurseryManageUpdateFo nurseryManageUpdateFo) {
//获取文件
MultipartFile[] multipartFile = nurseryManageUpdateFo.getMultipartFile();
//判断文件是否为空
if (multipartFile != null && !multipartFile[0].isEmpty()){
//获取返回的对文件路径,以逗号分隔
String url = ossUploadUtil.upload(multipartFile);
//存入数据中
nurseryManageUpdateFo.setFileUrl(url);
}
NurseryManage nurseryManage = nurseryManageConverter.from(nurseryManageUpdateFo);
QueryWrapper<NurseryManage> wrapper = new QueryWrapper<>();
wrapper.eq("version", nurseryManageUpdateFo.getVersion());
wrapper.eq("id", nurseryManageUpdateFo.getId());
nurseryManage.setUpdateTime(new Date());
Boolean updateResult = getBoolean(nurseryManage, wrapper);
//如果出现添加数据库失败并且获取到url,则删除存在到oss的文件
if (nurseryManageUpdateFo.getFileUrl()!=null && !updateResult) {
log.info("更新数据失败,删除已添加的文件");
ossUploadUtil.deleteFile(nurseryManageUpdateFo.getFileUrl());
}
return updateResult;
}