Skip to content

普通文件上传 - 公共上传接口

1. 文件上传配置

首先,要在 application.yml 中配置文件上传的相关配置
配置说明见:自定义配置 - 文件上传配置

yaml
com.kg:
   #文件上传配置
   file:
      #允许上传的文件格式(防止攻击类脚本文件上传,以|结尾)
      allow-extend: jpg|jpeg|png|gif|bpm|mp3|mp4|doc|docx|xls|xlsx|pdf|zip|rar|txt|
      #允许上传的图片格式(图片需要压缩,格式必须正确,以|结尾)
      image-extend: jpg|jpeg|png|gif|bpm|
      #图片自动压缩,压缩比率(0-1之间的小数,例如:0.6表示压缩为60%)
      image-quality: 0.6
      #文件上传物理路径(文件保存的物理绝对路径;不要使用\;若使用docker部署,要配置容器内部路径,一般是/usr/local/springboot/))
      save-path: /usr/local/springboot/myupload/files
      #文件路径映射(对外访问的路径,通过spring映射到物理路径;不要使用\;要在security.ignore放开)
      url-pre: /upload

2. 公共上传接口

  • 大部分的文件上传功能,都可以通过以下 2个接口完成。

公共上传接口

  • 如需自定义,可以使用文件上传工具类
    举例: wangEditor上传图片接口,需要单独开发,代码如下:

wangEditor上传接口

3. 上传文件工具类

- 3.1 文件路径工具

工具类:com.kg.component.file.FilePathConfig

  • 读取 application.yml 中的配置信息,填充到对应中备用
  • :把文件存储的绝对路径,转换成可访问的url路径
  • :把数据库里存储的文件访问路径,转换成文件存储的绝对路径
  • removeSpec():去除上传文件的文件名中的特殊字符

UploadFileUtils

- 3.2 图片上传工具(默认压缩)

工具类:com.kg.component.file.UploadImageUtils

共提供3个方法:

  • base64转存图片:base64格式数据转图片
  • 压缩上传图片:自定义文件夹,默认压缩
  • 上传图片:自定义文件夹,自定义压缩

UploadImageUtils

- 3.3 上传文件工具

工具类:com.kg.component.file.UploadFileUtils

共提供2个方法:

  • 文件上传:会根据文件头判断文件扩展名,自定义上传文件夹
  • byte[]转存文件:把byte[]数据,转成文件存储,自定义上传文件夹

UploadFileUtils

4. 文件类型检测

判断文件类型代码如下图所示:

判断文件类型

允许上传的文件格式,在 application.yml 中配置,详见:文件上传配置

yaml
com.kg:
  #文件上传配置
  file:
    #允许上传的文件格式(防止攻击类脚本文件上传,以|结尾)
    allow-extend: jpg|jpeg|png|gif|bpm|mp3|mp4|doc|docx|xls|xlsx|pdf|zip|rar|txt|

- 4.1 获取文件类型方法

  • 文件类型检测工具类:com.kg.component.file.utils.FileTypeUtils.java

该工具类中,有4个方法 getFileType() 的重载,获取文件类型

参数可以是:文件地址、文件对象、文件流 或 文件byte[]
返回值是:该文件的文件类型

java
public class FileTypeUtils {
    /**
     * 获取文件类型
     *
     * @param filePath 文件地址
     * @return 文件类型
     */
    public static String getFileType(String filePath) throws IOException {
        // 返回文件类型
    }

    public static String getFileType(File file) throws IOException {
        // 返回文件类型
    }

    public static String getFileType(FileInputStream fis) throws IOException {
        // 返回文件类型
    }

    public static String getFileType(byte[] fileBytes) throws IOException {
        // 返回文件类型
    }
}

- 4.2 配置文件类型映射

在 /module/src/main/resources/fileType.properties 中配置文件类型映射。

  • 目前大部分常用文件配置,已在文件中存在

配置文件类型映射

配置规则

如上图所示,配置文件类型
配置类型的格式是:【文件hash值|文件扩展名】

  1. “文件hash值” 是通过 4.1 中 getFileType() 方法获取的
  2. “|” 是分隔符
  3. “文件扩展名” 是文件类型,支持使用都好隔开
    例如:504B0304|docx,xlsx,pptx,zip,jar
    (表示504B0304文件头,可能是docx,xlsx,pptx,zip,jar中的任何一种格式)

- 4.3 在线配置文件类型的映射

  • 使用开发管理员登录,进入 系统配置 - 文件头管理, 如下图

在线配置文件类型映射

说明

  • 已上线的项目,可以直接在这里修改,会修改服务器端的配置文件,无需重新启动
  • 未上线的项目,建议直接修改fileType.properties配置文件后上线

- 4.4 未知文件类型,获取文件头

注意

  • 如果遇到以下情况时,需要修改文件头映射配置
  1. 发生文件类型判断错误
  2. 特殊格式的文件需要上传(例如:ofd)

怎么样得到文件头呢?

  • 使用开发管理员登录,进入 系统配置 - 文件头管理, 如下图

获取文件头

上图所示,我上传的文件为ofd,
而配置文件中,有一行配置:504B0304|docx,xlsx,pptx,zip,jar
因为 [504b0304140008080800] 包含 [504B0304]
所以只需将该行配置,改成:504B0304|docx,xlsx,pptx,zip,jar

总结说明

  • 如上图,点击上传按钮上传文件,即可得到对应的文件头
  • 如果该文件头,和配置文件头中,存在 重复部分重复 ,则会显示现有的扩展名
    如果是已存在的,则只需要 在该行结尾追加[,xxx]扩展名即可
  • 如果该文件头在配置文件中不存在,则显示其本来扩展名
    如果不存在,则需要 另起一行,写入[xxxxxx|xxx]文件的hash值和扩展名