目录

  • 前言
  • oss配置
  • 代码
  • 配置类
  • 上传文件
  • 文件列表
  • 文件删除
  • 文件下载
  • 控制层代码
  • 部分测试结果
  • 小结


前言

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

oss配置

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


首先我们要有自己的阿里云账号,去首页搜索oss。

进入到oss中,我们就要创建一个属于自己的bucket-name。这中间我们就不过多的表述了,其实很简单。

springBoot配置写对象属性数组_oss


像这样去设置就行了。

还需要一个AccessKey,点开右上角就能看到申请的地方;

springBoot配置写对象属性数组_spring boot_02


最后我们需要的四个参数:

endpoint,accesskey,accesssecret和bucketname

其中有个url,就是你上传文件之后用这个域名加上你的文件名来访问你的文件

springBoot配置写对象属性数组_oss对象存储_03

代码

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

配置类

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

/**
 * @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);
    }
}

部分测试结果

由于我自己测试了,文件删了一部分,就显示一部分效果了;

springBoot配置写对象属性数组_oss对象存储_04


下载和删除的效果没办法演示,烦请自行测试。

小结

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