记录一次使用Spring boot整合OSS对象存储的过程

前言

今天在公司的业务中遇到了这样一个问题。前端需要批量导出数据生成一个excel表(虽然这个最后还是被前端自己给搞定了),让我们后端去接收数据搞定生成。
最开始我的考虑是这样,在本地建立一个临时仓库,然后用easyExcel去根据拿到的json生成excel然后提供输出流去进行下载,下载完了之后在本地仓库进行删除。之后考虑了一下,如果同时很多人在线使用,这样无疑是对文件的读写压力非常大。
翻了翻配置文件,发现居然有oss配置(我是中途接手项目)。wtm顿时兴趣就来了,能用阿里帮我们去搞定,为啥要自己去费半天劲生成呢。

oss配置

虽然前端自己完成了,但是我们也不能让我们写的代码白费啊是不是。
开始正题。。。不吹牛逼了


首先我们要有自己的阿里云账号,去首页搜索oss。
进入到oss中,我们就要创建一个属于自己的bucket-name。这中间我们就不过多的表述了,其实很简单。
在这里插入图片描述
像这样去设置就行了。
还需要一个AccessKey,点开右上角就能看到申请的地方;
在这里插入图片描述
最后我们需要的四个参数:

endpoint,accesskey,accesssecret和bucketname

其中有个url,就是你上传文件之后用这个域名加上你的文件名来访问你的文件
在这里插入图片描述

代码

我们先参考官方文档给我们的案例。其实官网写的很详细了。
点这儿

配置类

我们首先新建一个全局配置类。

/**
 * @author: Zxy
 * @Date: 2021-04-08
 **/
@Configuration
@Data
public class AliyunConfig {

    private String END_POINT = "你的endpoint";

    private String ACCESS_KEY_ID = "你的accesskey";

    private String ACCESS_KEY_SECRET = "你自己申请的accesssecret";

    private String BUCKET_NAME = "你的bucket-name";

    private String URL_PREFIX = "https://zxy-0821.oss-cn-beijing.aliyuncs.com/";

    @Bean
    public OSSClient ossClient() {
        return new OSSClient(END_POINT, ACCESS_KEY_ID, ACCESS_KEY_SECRET);
    }

}

配置完成后,在你的工具类或者服务类上自动注入就行了。

上传文件

你可以新建一个工具类或者一个服务层类,我这儿就习惯了服务层的调用方式了

private String getFilePath(String sourceFileName) {
        DateTime dateTime = new DateTime();
        return "file/" + dateTime.toString("yyyy")
                + "/" + dateTime.toString("MM") + "/"
                + dateTime.toString("dd") + "/" + sourceFileName;
    }

    public String uploadToOss(MultipartFile file) throws IOException {
        // 1、根据拿到的file取出文件名进行拼接
        String filename = UUID.randomUUID().toString().replaceAll("-", "") + "_" + file.getOriginalFilename();
        byte[] byteArr = file.getBytes();
        InputStream inputStream = new ByteArrayInputStream(byteArr);
        String filePath = getFilePath(filename);
        // 关键方法,第一个参数是你的bucket-name 第二个是文件名 第三个是文件输入流
        ossClient.putObject(aliyunConfig.getBUCKET_NAME(), filePath, inputStream);
        // 会返回根据上面说的url去拼接文件名路径的地址,拿到就能直接复制到浏览器打开下载
        return aliyunConfig.getURL_PREFIX() + filePath;
    }
文件列表
    public List<OSSObjectSummary> fileList() {
        // 第一个参数bucket-name  查看源码可以看得到有其他的可选参数,我就不列举了
        return ossClient.listObjects(aliyunConfig.getBUCKET_NAME()).getObjectSummaries();
    }
文件删除
public void deleteFile(String filename) {
    // 参数1 bucket-name 参数2 在该bucket-name下的文件名的全路径
    ossClient.deleteObject(aliyunConfig.getBUCKET_NAME(), filename);
}
文件下载

文件下载其实就是通过响应头通知浏览器该文件是附件形式的下载

public void downloadFile(OutputStream os, String filename) throws IOException {
        // 参数1  bucket-name  参数2  文件名全路径
        OSSObject object = ossClient.getObject(aliyunConfig.getBUCKET_NAME(), filename);
        BufferedInputStream bi = new BufferedInputStream(object.getObjectContent());
        BufferedOutputStream bo = new BufferedOutputStream(os);
        byte[] buffer = new byte[1024];
        int i;
        while ((i = bi.read(buffer)) != -1) {
            bo.write(buffer, 0, i);
        }
        bo.close();
        bi.close();
    }
控制层代码
package com.zxy.controller;

import com.aliyun.oss.model.OSSObjectSummary;
import com.zxy.result.ResultData;
import com.zxy.service.OSSService;
import lombok.RequiredArgsConstructor;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;

import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.util.List;

/**
 * @author: Zxy
 * @Date: 2021-04-08
 **/
@RestController
@RequiredArgsConstructor
@CrossOrigin
public class OSSController {

    private final OSSService ossService;

    @PostMapping("/upload")
    public ResultData uploadToOss(@RequestParam(name = "file") MultipartFile file) throws IOException {
        String fileUrl = ossService.uploadToOss(file);
        return ResultData.success(fileUrl);
    }

    @PostMapping("/fileList")
    public ResultData fileList() {
        List<OSSObjectSummary> fileList = ossService.fileList();
        return ResultData.success(fileList);
    }

    @DeleteMapping("/deleteFile")
    public ResultData deleteFile(String filename) {
        ossService.deleteFile(filename);
        return ResultData.success(filename);
    }

    @GetMapping("/downloadFile")
    public void downloadFIle(HttpServletResponse response, String filename) throws IOException {
        response.setHeader("Content-Disposition",
                "attachment;filename=" + new String(filename.getBytes(), "ISO-8859-1"));
        ossService.downloadFile(response.getOutputStream(), filename);
    }
}

部分测试结果

由于我自己测试了,文件删了一部分,就显示一部分效果了;
在这里插入图片描述
下载和删除的效果没办法演示,烦请自行测试。

小结

其实很简单,多去看看官方文档就能解决。oss最主要的业务就是用来保存用户的头像,大文件这些还是不建议放这上面。。。毕竟是按照存储空间收钱的。。。
写的不好请见谅。

  • 2
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 4
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

鱼小洲

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值