最简单的方法可能是修补 boost beast 实现(见下文)。但是请确保,在这种情况下,您对 html 知之甚少,例如
- 使用“206 部分内容”回答 html 请求
- 使用适当的字段(内容范围)来识别文件的一部分并相应地设置响应。
可以在此处找到有关 html 标头的重要信息:
https://developer.mozilla.org/en-US/docs/Web/HTTP/Range_requests
然后 boost beast 只需要对 open() 方法进行一些小改动来传递部分文件(boost/beast/http/basic_file_body.hpp)。它是用 uint64_t 实现的,但 boost::optional<> 也可以做到这一点。
有两个主要的事情,真的很重要:
- seek() 到文件起始位置和
- 将余数(以 file_size_ 的形式)设置为数据长度(开始和结束之间的长度部分)。
请记住,起点和终点都包含在范围请求中。 IE。部分的长度始终为end-start+1。
但是进行此更改后,请提前阅读范围响应的整体文件大小,因为 size() 方法将返回部分大小。
template<class File>
void
basic_file_body<File>::
value_type::
open(char const* path, file_mode mode, error_code& ec, uint64_t start, uint64_t end)
{
// Open the file
file_.open(path, mode, ec);
if(ec)
return;
// Cache the size
file_size_ = file_.size(ec);
if(ec)
{
close();
return;
}
if (end > file_size_ || end == 0)
end = file_size_-1;
if (start <= end) {
file_.seek(start, ec);
if(ec)
{
close();
return;
}
file_size_ = end - start + 1;
}
}
请确保:可能还有其他方法可以进行部分读取!
汤姆