您可以认为您的 REST API 公开了一个虚拟文件系统,而您提到的 zip 文件只是该 VFS 中的一个资源,并且在某个目录中有文件来表示对该文件系统的查询。然后您可以通过向查询目录发送 POST 请求来创建一个新的查询对象,指定您需要的所有查询参数,例如块大小和 zip 文件在 VFS 中的路径。
我所指的虚拟文件系统实际上是一个目录,其中包含其他目录和文件,这些目录和文件可以代表磁盘上的真实文件或数据库中的元数据记录。
例如,假设您从 VFS 中的以下目录布局开始:
/myvfs
/files
/archive.zip
/queries
要下载 archive.zip 文件,您可以发送一个简单的 GET 请求:
// Request:
GET /myvfs/files/archive.zip
但这会立即流式传输整个文件。为了将其分成几部分,您可以创建一个查询,在其中下载 1MB 的块:
// Request:
POST /myvfs/queries/archive.zip
{
chunk_size: 1048576
}
// Response:
{
query_id: 42,
chunks: 139
}
新查询位于地址 /myvfs/queries/archive.zip/42,可以通过向该 URL 发送 DELETE 请求来删除。
现在,您可以分段下载 zip 文件。请注意,查询的创建实际上并没有为每个部分创建更小的文件,它只提供有关偏移量和块大小的信息,这些信息可以在任何地方持久保存,从 RAM 到数据库或纯文本文件。
要下载 zip 文件的前 1MB 块,您可以发送 GET 请求:
GET /myvfs/queries/archive.zip/42/0
最后一点,您还应该注意,可以对查询资源进行建模以适应其他场景,例如某个文件的动态范围。
附:我知道答案并不像应有的那么清楚,对此我深表歉意。如果时间允许,我会尝试回来完善它。