## 高新通文件中间件服务

### 功能清单

* 支持多文件、大文件拆分上传
* 支持已存在文件急速上传
* 支持文件断点续传
* 文件下载
* 文件过期机制
* 支持对象存储服务组件的扩展
* 图片资源支持缩略图

## 接口定义

### 1.文件上传接口

* 请求URL:`api/v1/files`
* 请求方法: `POST`
* 请求参数: `form-data`

#### header参数

_header参数可以不传，特殊需求下可以使用_

|参数|类型|说明|
|---|---|---|
|FILE-EXPIRE|数字|文件过期时间，如果为空则按服务配置中的默认过期时间(300秒), -1为不过期|
|FILE-HASH|字符串|文件hash值，如文件的md5|

#### 请求form-data参数

|参数|类型|说明|
|---|---|---|
|base_url|字符串|基本路径，对象桶的名称|
|form_key|字符串|form-data中的文件键值,如**data**|
|**data**|字符串|同form_key中配置的值|

### 2.请求文件

_对于文件的请求分两种情况，一种是直接显示文件，如图片、视频、pdf等， 一种下返回文件的二进制流(content-type:application/octet-stream),
前者的content-type是根据文件的类型返回的，后者固定为application/octet-stream,对于浏览器无法解析的content-type,会直接下载_

#### 2.1 打开文件(pdf\图片\视频)

* 请求URL: `文件的url`
* 请求方法: `GET`
* 请求参数: `见下方`

#### 缩略图参数说明

_在请求的url中拼接如下参数_
`?thumb=1&w=100&h=100`

`thumb`: 为1则说明开启缩略图模式

`w`: 缩略图宽度，数字

`h`: 缩略图高度，数字

#### 2.2 下载文件(返回文件的二进制流)

* 请求URL: `api/v1/files`
* 请求方法: `GET`
* 请求参数:

|参数|类型|说明|
|---|---|---|
|path|字符串|文件路径|
|name|字符串|要下载的文件名|

#### 2.3 文件本地化

_默认文件上传后为临时文件，不调用本地化则会过期删除(设置FILE-EXPIRE为-1的情况除外)_

* 请求URL: `/api/v1/files/persistent`
* 请求方法: `PUT`
* 请求参数: `JSON Body`

|参数|类型|说明|
|---|---|----|
|hash|字符串|文件的hash值|

### 3.文件分块上传

* 请求URL: `/api/v1/files/chunk`
* 请求方法: `POST`
* 请求参数: `form-data`

|参数|类型|是否必填|说明|
|---|---|-----|---|
|base_url|字符串|Y|基本路径，对象桶的名称|
|form_key|字符串|Y|form-data中的文件键值,如**data**|
|**data**|字符串|Y|同form_key中配置的值|
|index|数字|Y|当前文件块的索引，从1开始|
|total|数字|Y|当前文件总块数|
|hash|字符串|Y|目标文件的md5,非文件块md5|

## 用到的服务组件

### MYSQL

存储平台已经上传的文件信息，实现文件极速秒传

_上传文件时，把文件的文件名，大小，路径写入file_history表中，如果文件是默认过期的，设置is_persistent字段为2(非持久),反之设置为1(持久)，服务初始化时可以检测扫描此字段的值和
数据创建时间是否大于过期时间实现统一删除，这样可以处理防止服务重启时收不到部分文件过期消息的情况_

### REDIS

储存临时上传的文件hash,并做key过期消息发布。
