SpringBoot整合OSS的骚操作

2,496 阅读3分钟

这是我参与8月更文挑战的第26天,活动详情查看:8月更文挑战

image.png

今天聊下OSS,接下来一段时间,我会多整理一些和SpringBoot整合的案例。应用实践,干货满满。

以后可能会分为几大专题,类似于并发专题,源码专题,面试专题等(只会分享干货)。设计专题已经结束,感兴趣的可以点击我头像看下历史文章。

话不多说,进入正题

文件处理OSS

在我们日常开发中平常都是用什么实现文件上传呢,俗称文件服务器。最早以前呢。我用过FastDfs+Nginx的方式实现文件上传与访问。

早年间我写过一篇FastDfs+Nginx的记录

CSDN链接: blog.csdn.net/yangning_/a…

随着技术的更新迭代,依赖阿里云大生态的发展OSS应用而生

  • 阿里云对象存储服务(Object Storage Service,简称OSS),是阿里云对外提供的海量、安全、低成本、高可靠的云存储服务

  • 可以通过简单的REST接口,在任何时间、任何地点、任何互联网设备上进行上传和下载数据。基于OSS,您可以搭建出各种多媒体分享网站、网盘、个人和企业数据备份等基于大规模数据的服务。

使用OSS前提

你要在阿里云后台创建一套属于自己的OSS空间。这里不进行相应赘述(具体看下面官方文档),本节重点还是要放在SpringBoot上整合上

官方文档: help.aliyun.com/document_de…

那么接下来我们看SpringBoot整合OSS实现文件处理的功能

SpringBoot整合OSS

干啥都逃不过的第一步maven

<!-- 图片上传 SDK 阿里云oss -->
  <dependency>
   <groupId>com.aliyun.oss</groupId>
   <artifactId>aliyun-sdk-oss</artifactId>
   <version>3.4.0</version>
  </dependency>

下面是yml的配置

aliyun:
  oss:
    #oss对应的区域节点
    endpoint: http://oss-cn-qingdao.aliyuncs.com
    # 阿里对应的访问id accessId
    accessKeyId: 阿里云的accessId
    # 阿里对应accessKey
    accessKeySecret: 阿里云的accessKey

    # bucketName oss上bucket的名称
    bucketName: yn-bucket-1

1、oss对应的区域节点,oss列表点击进去就可以看到,bucketName自然也可以看到,当然是你提前先创建好环境

image.png

2、 阿里对应的 (accessId,accessKeySecret)都可以看到,阿里云后台点击右上方头像

image.png

代码实现

OK 上面的一切准备就绪好之后,我们来敲代码

/**
 * 操作oss工具类
 * @Date 2021/8/28 11:14 下午
 * @Author yn
 */
@Component
@Configuration
public class AliyunOssUtil {


    @Value("${aliyun.oss.endpoint}")
    private String endpoint;


    @Value("${aliyun.oss.accessKeyId}")
    private String accessKeyId;



    @Value("${aliyun.oss.accessKeySecret}")
    private String accessKeySecret;


    @Value("${aliyun.oss.bucketName}")
    private String bucketName;




    private OSS ossClient;


    /**
     * 初始化oss实例
     * 单例
     * @return
     */
    private OSS getInstance() {
        //控制并发
        if(ossClient==null){
            synchronized(AliyunOssUtil.class){
                if(ossClient==null){
                    ossClient = new OSSClientBuilder().build(endpoint, accessKeyId, accessKeySecret);
                }
            }
        }
        return ossClient;
    }



    /**
     * 上传
     */
    public void  upload(InputStream file, String fileName){
        getInstance().putObject(bucketName,fileName,file);
    }


    /**
     * 删除文件
     * @param fileName
     */
    public void deleteFile(String fileName) {
        OSS ossClient = getInstance();
        try {
            ossClient.deleteObject(bucketName, fileName);
        }
        catch (final Exception e) {
            System.out.println("删除文件失败, 文件名称 -> "+fileName);
        }
        finally {
            //保证能释放掉
            ossClient.shutdown();
        }
    }


    /**
     * 查询文件图片列表
     * @return
     */
    public List<OSSObjectSummary> list() {
        // 设置最大个数。
        final int maxKeys = 200;
        // 列举文件。
        ObjectListing objectListing = getInstance().listObjects(new ListObjectsRequest(bucketName).withMaxKeys(maxKeys));
        List<OSSObjectSummary> sums = objectListing.getObjectSummaries();
        return sums;
    }
}

我们调用下

@RestController
@RequestMapping
public class UploadController {

    @Autowired
    private AliyunOssUtil aliyunOssUtil;

    /**
     * 文件上传
     */
    @RequestMapping("/upload")
    public String upload(MultipartFile file) {
        try {
                String fileName = file.getOriginalFilename();
                /**
                 * 修改文件名称并保存文件
                 */
                String suffix = fileName.substring(fileName.lastIndexOf("."));
                //随机数 防止文件名称重复
                String uuid = UUID.randomUUID().toString();
                fileName = uuid + suffix;

                /**
                 * 入阿里云
                 */
                aliyunOssUtil.upload(file.getInputStream(),fileName);
        } catch (Exception e) {
            e.printStackTrace();
            return "失败";
        }
        return "成功"
    }
}

上传成功 image.png

总结

OK 看完上面的是不是感觉特别简单,省略了很多配置,其他的官方api大家可以再去尝试下一些其他的骚操作

这里注意下。尽量用随机数去命名。要不然会覆盖,不会报错

image.png