当前位置: 首页 > article >正文

【Java】阿里云OSS上传、删除文件

阿里云OSS上传、删除文件

编写AliOssConfig:


import lombok.Data;

/**
 * <p>DESC: </p>
 * <p>VERSION:1.0.0</p>
 */
@Data
public class AliOssConfig {
    private String endpoint;

    private String accessKey;

    private String accessSecret;

    private String bucket;

    private String defaultFolder="/";

    /**
     * 文件路径有效天数,天
     */
    private int expireDate=36500;

    /**
     * 访问类型0:public,1:私有
     */
    private int accessType=0;

}

具体实现类:

import java.io.ByteArrayInputStream;
import java.io.IOException;
import java.nio.file.FileSystemException;
import java.util.List;
import java.util.Objects;

/**
 * <p>阿里上传文件</p>
 *
 * @Description 阿里上传文件
 */
@Component("AliFileProcessingImpl")
@Slf4j
public class AliFileProcessingImpl implements FileProcessingService {

    @Autowired
    private SysSettingService sysSettingService;

    private AliOssConfig aliOssConfig = new AliOssConfig();

//todo 这里可以直接写在配置文件中使用@value ,这里就不写sysSettingService里面的相关方法了
    public AliOssConfig getSettingConfig(String type) {
        List<SysSetting> data = sysSettingService.getConfigList(type).getData();

        data.forEach(setting -> {
            String key = setting.getKey();
            String value = setting.getValue();

            // 根据枚举匹配对应的方法调用
            OssConfigKeyEnum.fromKey(key)
                    .ifPresent(action -> action.apply(aliOssConfig, value));
        });

        return aliOssConfig;
    }


    @Override
    public String uploadFile(MultipartFile file) throws IOException {
        String contentType = file.getContentType();
        byte[] fileBytes = file.getBytes();
        String fileMd5 = getFileMd5(fileBytes);
        String dbFile = getFileDO(fileMd5);
        if (Objects.nonNull(dbFile)) {
            return dbFile;
        }

        String fileName = file.getOriginalFilename();
        String fileType = FileUtil.getSuffixName(fileName);
        if (FileTypeEnum.getSuffixType(fileType) == null) {
            throw new FileSystemException(BizCodeEnum.UNSUPPORTED_FILE_TYPE.getMessage());
        }
        fileName = UUIDUtil.get32Uuid() + CommonSymbols.POINT + fileType;
        String url = upload(fileName, file.getBytes());
        log.info("OSS->{}", "上传的文件返回的地址:" + url);
        return url;
    }



    public Integer checkFileType(MultipartFile file) {
        String contentType = file.getContentType();

        if (contentType == null) {
            return -1;
        }

        if (contentType.startsWith("image/")) {
            return 1;
        } else if (contentType.startsWith("video/")) {
            return 2;
        } else {
            return 3;
        }
    }


    /**
     * 将文件上传到ali oss
     *
     * @param fileName 文件名
     * @param bytes    文件字节数据
     * @return 文件地址
     */
    private String upload(String fileName, byte[] bytes) {
        aliOssConfig = getSettingConfig(SystemSettingTypeConstant.OSS);
        log.info("info={}", "开始文件上传");
        OSS oss = initOss();
        oss.putObject(aliOssConfig.getBucket(), fileName, new ByteArrayInputStream(bytes));
        shutdown(oss);

        return CommonSymbols.HTTPS +
                aliOssConfig.getBucket() +
                CommonSymbols.POINT +
                aliOssConfig.getEndpoint() +
                CommonSymbols.SLASH +
                fileName;
    }

    /**
     * ali oss删除文件
     *
     * @param filename
     * @return
     */
    public boolean delete(String filename) {
        aliOssConfig = getSettingConfig(SystemSettingTypeConstant.OSS);
        // 填写文件完整路径。文件完整路径中不能包含Bucket名称。
        String objectName = filename;

        OSS ossClient = new OSSClientBuilder().build(aliOssConfig.getEndpoint(), aliOssConfig.getAccessKey(), aliOssConfig.getAccessSecret());
        try {
            // 删除文件或目录。如果要删除目录,目录必须为空。
            ossClient.deleteObject(aliOssConfig.getBucket(), objectName);
            return true;
        } 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."
                    + " \n Error Message:" + oe.getErrorMessage()
                    + " \n Error Code:" + oe.getErrorCode()
                    + " \n Request ID:" + oe.getRequestId()
                    + " \n Host ID:" + oe.getHostId()
            );
        } catch (ClientException 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."
                    + "Error Message:" + ce.getMessage());
        } finally {
            if (ossClient != null) {
                ossClient.shutdown();
            }
        }
        return false;
    }

    /**
     * 关闭oss连接
     *
     * @param oss 打开的oss对象
     */
    private void shutdown(OSS oss) {
        if (oss != null) {
            oss.shutdown();
        }
    }

    /**
     * 初始化启动oss连接
     *
     * @return OSS
     */
    private OSS initOss() {
        return new OSSClientBuilder().build(aliOssConfig.getEndpoint(), aliOssConfig.getAccessKey(),
                aliOssConfig.getAccessSecret());
    }

    private String getFileMd5(byte[] fileBytes) {
        return DigestUtil.md5Hex(fileBytes);
    }

    private String getFileDO(String md5) {
        LambdaQueryWrapper<SysAttachment> query = new LambdaQueryWrapper<>();
        query.eq(SysAttachment::getSha1, md5);
        List<SysAttachment> list = attachmentService.list(query);
        if (!CollectionUtils.isEmpty(list)) {
            return list.get(0).getUrl();
        }
        return null;
    }
}

http://www.kler.cn/a/517499.html

相关文章:

  • SpringBoot3+Vue3开发学生选课管理系统
  • 鸿蒙next 自定义日历组件
  • 【开源免费】基于Vue和SpringBoot的景区民宿预约系统(附论文)
  • RabbitMQ 多种安装模式
  • WebODM之python实现
  • python学opencv|读取图像(四十一 )使用cv2.add()函数实现各个像素点BGR叠加
  • git基础使用命令
  • YOLOv10-1.1部分代码阅读笔记-val.py
  • 《罗宾逊-旅途VR》Build2108907官方学习版
  • Oracle 机器宕机之后启动数据库
  • 大数据,Hadoop,HDFS的简单介绍
  • 从根源分析,调试,定位和解决MacOS ld: unsupported tapi file type ‘!tapi-tbd‘ in YAML file
  • Leecode刷题C语言之购买水果需要的最小金币数
  • 【实践】Python实现气象数据分析与可视化
  • Ubuntu 安装 QGIS LTR 3.34
  • SVN客户端使用手册
  • 逐笔成交逐笔委托Level2高频数据下载和分析:20250124
  • 计算机视觉算法实战——图像生成
  • Cloudpods是一个开源的Golang实现的云原生的融合多云/混合云的云平台,也就是一个“云上之云”。
  • 【python】subprocess.Popen执行adb shell指令进入linux系统后连续使用指令,出现cmd窗口阻塞问题
  • 总结与展望,龙蜥社区第 30 次运营委员会会议线上召开
  • 探究 Facebook 隐私安全发展方向,未来走向何方?
  • 深度学习算法:从基础到实践
  • RV1126画面质量三:QP调节
  • 实现GD32F470作为高速USB主机与USB鼠标通信的功能
  • uart、iic、spi通信总线