文件存储 API

文件存储 API

概述

收集平台各种小型文件,图片音频等。提供文件列表查询、删除、下载等接口。

版本

V2.1

作者

ChengZhen

修改记录

2018/9/10

文件管理

属性列表

NAME SORTABLE TYPE DESCRIPTION
id - ObjectId 文件 ID
created true Date 创建时间, 单位为毫秒
etag true String 文件 Etag, 唯一标识同一内容的文件
maintype true String MIME 主类型
name true String 文件名, 1 到 255 个字符
ownerId true ObjectId 用户的 ID
size true Number 文件大小, 单位为字节
subtype true String MIME 次类型
updated true Date 修改时间, 单位为毫秒

主类型:

次类型:

etag:

上传文件

可以用new FormData 把上传的文件数据序列化,例如new FormData().append(key,value),key必须为“files”,value为文件数据,多文件上传就append多个数据;通过Ajax传输这个序列,设置Ajax参数contentType为false。

POST /file/upload (or PUT /file/)

请求格式

Content-Type: multipart/form-data; boundary=${boundary}

请求参数:

NAME REQUIRED TYPE DESCRIPTION
files true buffer 文件内容

响应结果:

返回上传的文件的信息

{
    "files": [{
        "created": Number,      // 文件创建时间
        "id": String,           // 文件 ID
        "maintype": String,     // 文件主类型
        "name": String,         // 文件名称
        "etag": String,         // 文件 etag
        "owner": String,        // 文件拥有者
        "size": Number,         // 文件大小
        "subtype": String,      // 文件次类型
        "updated": Number       // 文件最后修改时间
    }]
}

查询文件列表

GET /file/list (or GET /file/)

请求参数:

NAME TYPE DEFAULT DESCRIPTION
offset Number 1 分页索引值
limit Number 10 每页最大结果数
orderBy String created 要排序的字段
order String asc 排序方式 (asc:升序,desc:降序)
q String - 查询条件
maintype String - 文件主类型
subtype String - 文件次类型
owner String - 文件拥有者
etag String - 文件 etag
name String - 文件名

示例

/file/list?offset=0&maxResult10&orderBy=name&q=maintype==image

响应结果:

返回包含文件信息的列表

{
    "files": [{
        "created": Number,      // 文件创建时间
        "id": String,           // 文件 ID
        "maintype": String,     // 文件主类型
        "name": String,         // 文件名称
        "etag": String,         // 文件 etag
        "owner": String,        // 文件拥有者
        "size": Number,         // 文件大小
        "subtype": String,      // 文件次类型
        "updated": Number       // 文件最后修改时间
    }],
    "total": Number
}

删除文件

POST /file/del (or DELETE /file/:id)

请求参数:

NAME REQUIRED TYPE DESCRIPTION
id true ObjectId 要删除的文件的 ID

说明:

响应结果:

返回删除的文件的信息

{
    "created": Number,      // 文件创建时间
    "id": String,           // 文件 ID
    "maintype": String,     // 文件主类型
    "name": String,         // 文件名称
    "etag": String,         // 文件 etag
    "owner": String,        // 文件拥有者
    "size": Number,         // 文件大小
    "subtype": String,      // 文件次类型
    "updated": Number       // 文件最后修改时间
}

修改文件属性

POST /file/update (or POST /file/:id)

请求参数:

NAME REQUIRED TYPE DEFAULT DESCRIPTION
id true ObjectId - 要修改的文件的 ID
name - String - 修改后的文件名称

响应结果:

返回修改后的文件的信息

{
    "created": Number,      // 文件创建时间
    "id": String,           // 文件 ID
    "maintype": String,     // 文件主类型
    "name": String,         // 文件名称
    "etag": String,         // 文件 etag
    "owner": String,        // 文件拥有者
    "size": Number,         // 文件大小
    "subtype": String,      // 文件次类型
    "updated": Number       // 文件最后修改时间
}

访问文件

下载文件

  • GET /file/:id/
  • GET /:maintype/:name

请求参数:

NAME REQUIRED TYPE DESCRIPTION
id true ObjectId 文件的 ID
maintype true String 文件的主类型, 如 audio, image, video
subtype true String 文件的子类型, 如 jpeg, mp3, mp4
name true String 文件的名称, 如 'test.jpg'

说明:

示例:

/file/31b84669d4ec6ddbf0db54d8b551f8ea.jpeg
/file/e42876e1c9fa61c1e5c44a58705a78f9.mp3

/image/raw.jpeg
/audio/raw.mp3

响应头:

Content-Type: ${file.mimetype}
Content-Length: ${file.size}
Last-Modified: ${format(file.created)}
Etag: ${file.id}

响应结果:

如果 If-None-MatchIf-Modified-Since 和文件的 ID 和修改时间匹配, 则返回不包含文件内容的状态码为 304 的 HTTP 应答.

否则返回文件内容.

下载缩略图

缩略图和原图的宽高保持原比例, 缩略图总是 jpeg 格式.

GET /file/thumbnail/:id.jpeg (or GET /file/:id/thumbnail.jpeg)

请求参数:

NAME REQUIRED TYPE DEFAULT DESCRIPTION
id true ObjectId - 要取缩略图图片对应的 id 值
size - Number 750 设置压缩图片的宽高压缩上限

说明:

示例:

短边不超过 172, 长边按比缩小, 比如压缩后 200x172, 172x200
/file/thumbnail/e42876e1c9fa61c1e5c44a58705a78f9?size=172
/file/e42876e1c9fa61c1e5c44a58705a78f9/thumbnail.jpeg?size=172

宽和高都是 172, 多余的部分将被裁减, 比如压缩后 172x172
/file/e42876e1c9fa61c1e5c44a58705a78f9/thumbnail.jpeg?size=172,172

长边不超过 172, 短边按比缩小, 比如压缩后 100x172, 172x100
/file/e42876e1c9fa61c1e5c44a58705a78f9/thumbnail.jpeg?size=0,172
/file/e42876e1c9fa61c1e5c44a58705a78f9/thumbnail.jpeg?size=172,0

响应头:

HTTP/1.1 200 OK
Content-Type: image/jpeg
Content-Length: ${thumbnail.size}
Last-Modified: ${Date(file.created)}
Etag: ${file.etag}
...

响应结果:

如果 If-None-MatchIf-Modified-Since 和文件的 ID 和修改时间匹配, 则返回不包含文件内容的状态码为 304 的 HTTP 应答.

否则返回文件内容.

统计信息

全局统计信息

GET /file/stat

响应结果:

{
    "count": {
        "total": Number,   // 总文件数
        "images": Number,  // 图片文件数
        "audio": Number,   // 音频文件数
        "video": Number    // 视频文件数
    },
    "size": {
        "total": Number,   // 总文件大小, 单位为字节
        "images": Number,  // 图片文件大小
        "audio": Number,   // 音频文件大小
        "video": Number    // 视频文件大小
    }
}

用户统计信息

GET /file/stat/self

响应结果:

{
    "count": {
        "total": Number,   // 总文件数
        "images": Number,  // 图片文件数
        "audio": Number,   // 音频文件数
        "video": Number    // 视频文件数
    },
    "size": {
        "total": Number,   // 总文件大小, 单位为字节
        "images": Number,  // 图片文件大小
        "audio": Number,   // 音频文件大小
        "video": Number    // 视频文件大小
    }
}