# 文件上传下载组件

# 概述

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

# 导入依赖

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

# 配置文件

配置spring框架对文件大小的限制配置

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

说明:hos-starter-dependencies在1.2.0-RELEASE版本之后,hos-app-dependencies在2.4.0-RELEASE版本之后,文件存储相关配置从yaml移到了数据库,之前的配置不再生效,最新配置方式请参考文件存储管理

# 在数据库中创建hos_sys_file表

CREATE TABLE `hos_sys_file` (
  `id` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '主键id',
  `file_name` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '文件名称',
  `md5` varchar(32) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '文件md5值',
  `path` varchar(100) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL COMMENT '文件路径',
  `file_size` varchar(255) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci DEFAULT NULL COMMENT '文件大小',
  `create_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP COMMENT '创建时间',
  `update_time` timestamp NULL DEFAULT CURRENT_TIMESTAMP ON UPDATE CURRENT_TIMESTAMP COMMENT '修改时间',
  `tenant_id` bigint DEFAULT NULL COMMENT '租户id',
  `file_config_id` char(32) DEFAULT NULL COMMENT '文件存储配置id',
  PRIMARY KEY (`id`) USING BTREE
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci ROW_FORMAT=DYNAMIC

# 接口

# 上传文件并返回文件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(请求最大限制),调整至合适的数值