目录
- 前言
- 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最主要的业务就是用来保存用户的头像,大文件这些还是不建议放这上面。。。毕竟是按照存储空间收钱的。。。
写的不好请见谅。