# 文件上传下载组件

# 概述

在web开发中,文件上传下载是一个非常常见的功能,本文主要讲解HOS的file组件如何使用。

# 导入依赖

<dependency>
    <groupId>com.mediway.hos</groupId>
    <artifactId>hos-framework-file-starter</artifactId>
</dependency>

# 配置文件

在配置文件配置file组件配置项

framework:
  file:
    upload:
      path: E:/upload/
    view:
      path: /viewPath
    addresses: http://127.0.0.1:8007
    minio:
      enable: true
      endpoint: http://127.0.0.1:9000
      accessKey: minioadmin
      secretKey: minioadmin

spring:
  servlet:
    multipart:
      max-file-size: 10485760
      max-request-size: 20MB

说明:

  • framework.file: 是file组件的配置项
  • framework.file.upload.path:文件在服务器的存储目录,以/结尾,默认为/opt/fileServer/upload/
  • framework.file.view.path:文件访问路径,以/结尾,默认为/viewPath/
  • framework.file.addresses:本地服务器地址以及端口
  • framework.file.minio: minio相关配置项
  • framework.file.minio.enable: 是否开启minio,开启之后文件会上传到minio服务器
  • framework.file.minio.endpoint: minio服务器地址
  • framework.file.minio.accessKey: minio服务用户名
  • framework.file.minio.secretKey: minio服务秘密
  • spring.servlet.multipart: spring对上传文件的大小设置

# 在数据库中创建hos_sys_file表

CREATE TABLE `hos_sys_file` (
    `id` varchar(32) NOT NULL,
    `file_name` varchar(100) NOT NULL,
    `md5` varchar(32) DEFAULT NULL,
    `path` varchar(100) NOT NULL,
    `file_size` varchar(255) DEFAULT NULL,
    `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
    `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
    `tenant_id` bigint(20) DEFAULT NULL COMMENT '租户id',
    PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;

# 接口

# 上传文件并返回文件id

请求方式

url:http://localhost:8367/file/uploadReturnId
method:POST  
Content-Type: multipart/form-data;charset=UTF-8

body入参

参数 类型 是否可选 描述
file 文件 必选 需要上传的文件
fileName String 可选 文件名称

响应结果

{
  "code": "200",
  "msg": "success",
  "data": {
    "fileId": "91c328b3bd6ee5c3cfb502f7ccb2acac"
  },
  "success": true
}

# 上传文件并返回文件访问相对路径

请求方式

url:http://localhost:8367/file/uploadReturnUrl
method:POST  
Content-Type: multipart/form-data;charset=UTF-8

body入参

参数 类型 是否可选 描述
file 文件 必选 需要上传的文件
fileName String 可选 文件名称

响应结果

{
  "code": "200",
  "msg": "success",
  "data": {
    "id": "dc4f9ae4080c4c69fc894c1d4f8b5a02",
    "fileName": "libEGL.dll",
    "md5": null,
    "fileUrl": "http://localhost:8367/viewPath/668310f4-0dfd-4d77-b440-e78c51fbcf0e.jpg",
    "fileSize": "403.4KB"
  },
  "success": true
}
参数 类型 是否可选 描述
id String 必选 文件id
fileName String 必选 文件名称
md5 String 可选 文件md5码
fileUrl String 必选 文件路径

普通模式下,在文件路径之前加上服务器的地址就是文件访问路径,
如http://localhost:8080/api/viewPath/668310f4-0dfd-4d77-b440-e78c51fbcf0e.jpg
若是使用minio模式,直接访问返回的路径可下载,minio模式需要将hos-starter-dependencies版本升级到1.0.12-RELEASE才可以使用

# 通过id获取文件信息

请求方式

url:http://localhost:8367/file/getFileById?id=xxx
method:GET  
Content-Type: multipart/form-data;charset=UTF-8

入参

参数 类型 是否可选 描述
id String 必选 文件id(上传接口出参中的文件id)

响应结果

{
  "code": "200",
  "msg": "success",
  "data": {
    "id": "dc4f9ae4080c4c69fc894c1d4f8b5a02",
    "fileName": "libEGL.dll",
    "md5": null,
    "fileUrl": "http://localhost:8367/viewPath/668310f4-0dfd-4d77-b440-e78c51fbcf0e.dll",
    "fileSize": "403.4KB",
    "createTime": null,
    "updateTime": null
  },
  "success": true
}

# 下载

请求方式

url:http://localhost:8367/file/downloadById?id=xxx
method:GET  
Content-Type: multipart/form-data;charset=UTF-8

入参

参数 类型 是否可选 描述
id String 必选 文件id(上传接口出参中的文件id)

响应结果为一个文件流

# 多租户上传

开启多租户后,上传时根据不同的租户id会创建对应的目录。

请求方式

url:http://localhost:8367/file/uploadReturnUrl
method:POST  
Content-Type: multipart/form-data;charset=UTF-8

body入参

参数 类型 是否可选 描述
file 文件 必选 需要上传的文件
fileName String 可选 文件名称

headers入参

参数 类型 是否可选 描述
tenantId String 可选 租户id

响应结果

{
  "code": "200",
  "msg": "success",
  "data": {
    "id": "dc4f9ae4080c4c69fc894c1d4f8b5a02",
    "fileName": "libEGL.dll",
    "md5": null,
    "fileUrl": "http://localhost:8367/viewPath/xxxxxx/668310f4-0dfd-4d77-b440-e78c51fbcf0e.jpg",
    "fileSize": "403.4KB"
  },
  "success": true
}
参数 类型 是否可选 描述
id String 必选 文件id
fileName String 必选 文件名称
md5 String 可选 文件md5码
fileUrl String 必选 文件路径,xxxx为入参的租户id值

注意:若上传文件过大会出现超过最大限制的错误,如下图

img.png

需要将配置项spring.servlet.multipart.max-file-size(最大文件限制) 与spring.servlet.multipart.max-request-size(请求最大限制),调整至合适的数值