文件上传下载
章节简介
本章节介绍系统中文件上传后存储的方式,包括基于MinIO、本地存储。以及文件存储后下载
上传文件
严重警告
目前系统支持Minio和本地两种文件存储方式,这两种方式在文件上传后返回的文件路径上是有区别的,本地存储返回的是相对路径,Minio返回的是绝对路径。 请勿必让前端注意动态判断文件路径,如果是全路径则直接使用,如果是相对路径则需要拼接域名后再使用!!!
- 文件上传作为一个系统常用功能,在业务中经常用到,框架已经对文件上传进行了封装,可以直接使用。请查看
system包下的SysOssController的upload()方法 - 系统上传文件应该统一使用此接口,各业务只需获取此接口返回的文件路径及文件名即可
- file字段为上传的文件,serverCode为存储类型,系统默认支持Local和Minio两种方式,下面详细介绍,name为文件名
- 此接口为/admin开头的接口,需要登录后使用,如需要在未登录情况下上传文件,可以复制一份此接口至api目录下
@ApiOperation("上传文件")
@PostMapping(value = "/upload")
public Result upload(@RequestParam(name = "file") MultipartFile file,
@RequestParam(name = "serverCode", required = false) String serverCode,
@RequestParam(name = "name", required = false) String name) {
if (StringUtil.isEmpty(serverCode)) {
serverCode = ossProperties.getDefaultType();
}
if (file == null || file.isEmpty()) {
return new Result(ResultCode.BAD_REQUEST, "请选择要上传的文件");
}
SysOss upload = baseService.upload(file, serverCode, name);
return new JsonResult<>(upload);
}
文件存储至Minio
Minio是基于Amazon S3协议的云存储服务,它是一个开源的云存储中间件,一般在开发及测试环境中,使用Minio去存储文件,可以做到测试环境和开发环境文件的同步。 请在application.yml配置文件中,设置Minio的相关信息,并且设置默认存储类型为Minio,如下所示:- 目前公司已搭建
http://minio-s3.cnsaas.com这个Minio端点做为通用文件存储服务,如需使用,请联系技术经理获取访问Key和密钥 - 由于Minio返回的是绝对路径,直接通过返回的路径访问即可
oss:
config:
default-type: Minio # OSS上传文件默认传输位置
# 支持的文件上传类型
support-ext: xls,xlsx,doc,docx,ppt,pptx,pdf,txt,jpg,jpeg,png,gif,bmp,zip,rar,7z,pdf,mp4,avi,mov
# minio相关配置,参阅Minio
minio:
endpoint: http://minio-s3.cnsaas.com
accessKey: 访问Key
secret: 密钥
bucket: 桶
文件存储至本地
警告
若使用本地存储的方式,建议在生产环境中,使用Nginx去代理文件存储目录,不要让Java去处理静态资源,这样可以提高系统的速度。
- 存储至本地为最传统,最基础的方式,在
application.yml配置文件中设置默认存储类型为LocalServer即可 - 文件会存储值
path目录下,url是拼接在文件名前面的前缀 - 由于本地存储返回的是相对路径,需要拼接域名后再使用
- 按照以下配置文件举例说明:上传文件后,返回的url是
/vpath/data/image/png/aaaa.jpg,则
访问地址:http://localhost:9090/vpath/data/image/png/aaaa.jpg
存储位置:/mnt/data/file/image/png/aaaa.jpg
oss:
config:
#支持本地LocalServer和Minio两种方式
default-type: LocalServer
support-ext: xls,xlsx,doc,docx,ppt,pptx,pdf,txt,jpg,jpeg,png,gif,bmp,zip,rar,7z,pdf,mp4,avi,mov
local-oss:
path: /mnt/data/file
url: /vpath/data
下载文件
当后端在代码中需要下载文件时,可以通过OssSaveUtil的download()方法,系统会根据配置文件中的default-type来判断存储类型,从而下载对应的文件, 获取到输入流后,可按需求进行后续操作
// 本地存储
InputStream inputStream = OssSaveUtil.download("/vpath/data/image/png/aaaa.jpg");
// Minio存储
InputStream inputStream = OssSaveUtil.download("http://minio-s3.cnsaas.com/scaffold-boot-3/aaaa.jpg");
附件与图片
- 图片建议数据库中直接存储路径即可
- 附件建议以json的形式将路径,文件名存储到数据库字段中,json格式读取,存储请参考常见问题->数据库中json字段的使用
