• 【案例实战】SpringBoot整合阿里云文件上传OSS


    1.需求背景
    • C端业务用户头像上传
    • 海量图片音频、视频存储
    • 用户行为日志存储

    (1)阿里云OSS介绍

    • 对象存储OSS(Object Storage Service)是阿里云提供的海量、安全、低成本、高持久的云存储服务。其数据设计持久性不低于99.9999999999%(12个9),服务设计可用性不低于99.995%。

    • OSS具有与平台无关的RESTful API接口,您可以在任何应用、任何时间、任何地点存储和访问任意类型的数据。

    • 提供标准、低频访问、归档和冷归档四种存储类型,全面覆盖从热到冷的各种数据存储场景:

    标准存储类型高持久、高可用、高性能的对象存储服务,支持频繁的数据访问。是各种社交、分享类的图片、音视频应用、大型网站、大数据分析的合适选择。
    低频访问存储类型适合长期保存不经常访问的数据(平均每月访问频率1到2次)。存储单价低于标准类型,适合各类移动应用、智能设备、企业数据的长期备份,支持实时数据访问。
    归档存储类型适合需要长期保存(建议半年以上)的归档数据,在存储周期内极少被访问,数据进入到可读取状态需要1分钟的解冻时间。适合需要长期保存的档案数据、医疗影像、科学资料、影视素材。
    冷归档存储类型适合需要超长时间存放的极冷数据。例如因合规要求需要长期留存的数据、大数据及人工智能领域长期积累的原始数据、影视行业长期留存的媒体资源、在线教育行业的归档视频等。
    2.开通阿里云OSS

    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述
    在这里插入图片描述

    注意:这块secret一定要自己保存起来,后续无法查到这个值。

    在这里插入图片描述

    3.创建SpringBoot项目

    (1)创建maven项目,添加maven依赖

    	<parent>
            <groupId>org.springframework.bootgroupId>
            <artifactId>spring-boot-starter-parentartifactId>
            <version>2.6.7version>
            <relativePath/> 
        parent>
    
    	<dependencies>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-webartifactId>
            dependency>
            <dependency>
                <groupId>org.springframework.bootgroupId>
                <artifactId>spring-boot-starter-testartifactId>
                <scope>testscope>
            dependency>
            <dependency>
                <groupId>org.projectlombokgroupId>
                <artifactId>lombokartifactId>
                <version>1.18.20version>
                <scope>compilescope>
            dependency>
        dependencies>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24

    (2)创建主类

    @SpringBootApplication
    public class OssApplication {
        public static void main(String[] args) {
            SpringApplication.run(OssApplication.class, args);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (3)创建yml配置文件

    server:
      port: 8019
    spring:
      application:
        name: oss-server
    
    • 1
    • 2
    • 3
    • 4
    • 5

    (4)启动验证

    在这里插入图片描述

    4.SpringBoot整合OSS

    (1)添加oss-maven依赖

            
            <dependency>
                <groupId>com.aliyun.ossgroupId>
                <artifactId>aliyun-sdk-ossartifactId>
                <version>3.10.2version>
            dependency>
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6

    (2)yml配置OSS信息

    # 阿里云OSS配置
    aliyun:
      oss:
        end-point: oss-cn-hangzhou.aliyuncs.com
        access-key-id: LTAI5t9we1rWEkQijbzT75iU
        access-key-secret: OXK24t76IPxoDdAUaPXiWY8N0BkVfy
        bucket-name: oss-test-img
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7

    (3)读取yml配置,创建OSSConfig

    /**
     * @description OSS配置类
     * @author lixiang
     */
    @ConfigurationProperties(prefix = "aliyun.oss")
    @Configuration
    @Data
    public class OSSConfig {
    
        private String endPoint;
        private String accessKeyId;
        private String accessKeySecret;
        private String bucketName;
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15

    (4)编写FileService

    public interface FileService {
    
        /**
         * 阿里云OSS文件上传
         * @param file
         * @return
         */
        String upload(MultipartFile file);
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10

    (5)编写实现类FileServiceImpl

    /**
     * 文件上传业务类
     *
     * @author lixiang
     */
    @Service
    @Slf4j
    public class FileServiceImpl implements FileService {
    
        @Autowired
        private OSSConfig ossConfig;
    
        /**
         * 阿里云OSS文件上传
         *
         * @param file
         */
        @Override
        public String upload(MultipartFile file) {
    
            //获取相关配置
            String bucketName = ossConfig.getBucketName();
            String endPoint = ossConfig.getEndPoint();
            String accessKeyId = ossConfig.getAccessKeyId();
            String accessKeySecret = ossConfig.getAccessKeySecret();
    
            //创建OSS对象
            OSS ossClient = new OSSClientBuilder().build(endPoint, accessKeyId, accessKeySecret);
    
            //获取原生文件名
            String originalFilename = file.getOriginalFilename();
            //JDK8的日期格式
            LocalDateTime time = LocalDateTime.now();
            DateTimeFormatter dft = DateTimeFormatter.ofPattern("yyyy/MM/dd");
    
            //拼装OSS上存储的路径
            String folder = dft.format(time);
            String fileName = generateUUID();
            String extension = originalFilename.substring(originalFilename.lastIndexOf("."));
    
            //在OSS上bucket下的文件名
            String uploadFileName = "user/" + folder + "/" + fileName + extension;
    
            try {
                PutObjectResult result = ossClient.putObject(bucketName, uploadFileName, file.getInputStream());
                //拼装返回路径
                if (result != null) {
                    return "https://"+bucketName+"."+endPoint+"/"+uploadFileName;
                }
            } catch (IOException e) {
                log.error("文件上传失败:{}",e.getMessage());
            } finally {
                //OSS关闭服务,不然会造成OOM
                ossClient.shutdown();
            }
            return null;
        }
    
        /**
         * 获取随机字符串
         * @return
         */
        private String generateUUID() {
            return UUID.randomUUID().toString().replaceAll("-", "").substring(0, 32);
        }
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40
    • 41
    • 42
    • 43
    • 44
    • 45
    • 46
    • 47
    • 48
    • 49
    • 50
    • 51
    • 52
    • 53
    • 54
    • 55
    • 56
    • 57
    • 58
    • 59
    • 60
    • 61
    • 62
    • 63
    • 64
    • 65
    • 66

    (6)编写控制层

    @Slf4j
    @RestController
    @RequestMapping("/file")
    public class FileController {
    
        @Autowired
        private FileService fileService;
    
        /**
         * 文件上传接口
         * @param file
         * @return
         */
        @PostMapping("/upload")
        public Map<String, Object> upload(@RequestPart("file") MultipartFile file){
            String imgFileStr = fileService.upload(file);
            return buildResult(imgFileStr);
        }
    
        /**
         * 测试返回拼装,根据公司自己封装的统一返回去写
         * @param str
         * @return
         */
        private Map<String,Object> buildResult(String str){
            Map<String, Object> result = new HashMap<>();
            //判断字符串用lang3下的StringUtils去判断,这块我就不引入新的依赖了
            if(str== null || "".equals(str)){
                result.put("code",10000);
                result.put("msg","图片上传失败");
                result.put("data",null);
            }else{
                result.put("code",200);
                result.put("msg","图片上传成功");
                result.put("data",str);
            }
            return result;
        }
    
    }
    
    • 1
    • 2
    • 3
    • 4
    • 5
    • 6
    • 7
    • 8
    • 9
    • 10
    • 11
    • 12
    • 13
    • 14
    • 15
    • 16
    • 17
    • 18
    • 19
    • 20
    • 21
    • 22
    • 23
    • 24
    • 25
    • 26
    • 27
    • 28
    • 29
    • 30
    • 31
    • 32
    • 33
    • 34
    • 35
    • 36
    • 37
    • 38
    • 39
    • 40

    (7)测试文件上传

    在这里插入图片描述

    在这里插入图片描述

  • 相关阅读:
    自定义view实战(10):贝塞尔曲线绘制小红点
    JavaScript代码是怎么在浏览器里面运行起来的?
    网站绑定证书的情况下是否可以避免流量劫持呢?
    房屋信贷违约风险竞争(kaggle)系列4-基准模型
    Webmin -- Custom Commands模块
    JDK 17 营销初体验 —— 亚毫秒停顿 ZGC 落地实践
    我的创作纪念日(两周年)
    HTML 实现仿 Windows 桌面主题特效
    螺纹快速接头在卫浴行业中的应用提高产量降低生产成本
    【python】云打印实现
  • 原文地址:https://blog.csdn.net/weixin_47533244/article/details/127853069