FileService 主要能力
FileService用于向各个业务领域提供文件上传、下载的能力。在FileService的所有接口中,都存在一个名为file context
的结构体,该参数通常用于指定文件相关的信息。其结构如下:
message FileContext {
// 所属业务领域,用于创建bucket
string domain = 1;
// 所属业务名称
string biz_name = 2;
// 文件id
int64 file_id = 3;
// 文件sha256 hash
string hash = 4;
// 文件类型
string file_type = 5;
// 文件大小,单位byte
int64 size = 6;
// 文件访问链接的过期时间
int64 expire_seconds = 7;
// 文件名
string filename = 8;
}
在各个请求中,domain
和biz_name
两个参数为必传项,这个2个参数组合后,将使得FileService所依赖的表以业务领域为维度进行第一次分表。在此基础上,可以为每个业务领域配置一个对应的二次分表,可以指定其分为若干张子表。
Quick Start
FileService对于不同业务领域和不同业务项,其文件数量的扩增速度是不同的,带来的数据量很有可能天差地别。所以,要使用FileService的能力,需要在FileService中进行配置分表数量。
在config.yaml
中,可以配置如下内容:
data:
db_sharding_config:
file_shortvideo_short_video:
sharding: file_shortvideo_short_video
sharding_number: 5
db_sharding_config
项用于配置分表数量,其下的file_shortvideo_short_video
为分表key,其中"file"为固定值,shortvideo
为业务领域,short_video
为业务名称。sharding_number
为分表数量。业务领域和业务名称需要在使用FileService时传入。如不进行配置,则默认分表数量为1。
主要链路
普通上传/下载
分片上传/断点续传
主要能力
普通上传
FileService.PreSignPut
提供了最基础的上传能力。该接口需要额外上传的参数包括:
- hash: 文件的sha256值
- file_type: 文件类型
- size:文件大小(字节数)
- expire_seconds:文件上传链接的过期时间
例如,可以向此接口传入这样的参数:
{
"file_context": {
"domain": "shortvideo",
"biz_name": "short_video",
"hash": "8D6BB0819A2C1E66F846031DC54AAF47",
"file_type": "pdf",
"size": 1181178,
"expire_seconds": 86400
}
}
访问后,该接口将返回一个上传链接(http),由上游服务/前端直接将文件上传到该链接。一个上传示例代码(Python):
with open(file_path, 'rb') as file_data:
response = requests.put(
minio_url, # 接口返回的上传链接
data=file_data,
headers={"Content-Type": "application/octet-stream"}
)
print(response)
return response.status_code
通过上述Python代码的方式上传完成后,并不能直接访问到该文件,需要通过FileService.ReportUploaded
接口来进行上传确认,只有上传确认后的文件,才会在数据库中被标记为uploaded
并能被访问到。关于FileService.ReportUploaded
的具体使用,将在下文中详细介绍。