阿里云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;
    }
  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值