c++ - 如何在 Poco::HTTPClientSession 中获取下载大小?

标签 c++ download poco windows-networking

HTTPClientSession session(uri.getHost(), uri.getPort());
HTTPRequest req(HTTPRequest::HTTP_GET, path, HTTPMessage::HTTP_1_1);
session.setTimeout(Poco::Timespan(20,0));
session.sendRequest(req);
HTTPResponse res;
istream& rs = session.receiveResponse(res);

File saveTo(request.name,File::WriteOnly,true);
char aux_buffer[1024];
rs.read(aux_buffer, 1024);
std::streamsize n = rs.gcount();
while (n > 0){
    saveTo.write(aux_buffer,n);
    if (rs){
        rs.read(aux_buffer, 1024);
        n = rs.gcount();
    }
    else n = 0;
    }

如何在下载前获取下载大小? 因为有时我得到损坏的文件,所以我想检查大小。

最佳答案

您可以使用 HTTPResponse::getContentLength()getContentLength64():

Returns the content length for this message, which may be UNKNOWN_CONTENT_LENGTH if no Content-Length header is present.

请注意,您必须先调用 HTTPClientSession::receiveResponse() 才能接收 header 。您可能还想检查 HTTPResponse::getStatus() 以验证请求是否正常,如果您需要特定类型,则检查 HTTPResponse::getContentType()

对于 PDF,您可以检查文件本身的开始/结束标记。正确的 PDF 文件应以 %PDF-X.Y% 开头(其中 X.Y 代表版本)并以 %%EOF 结尾,可能后跟 0x0D 和/或 0x0A。一个 PDF 文件可能包含多个 %%EOF 标记。

关于c++ - 如何在 Poco::HTTPClientSession 中获取下载大小?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13392702/

相关文章:

xcode - setDownloadProgressBlock中的totalBytesExpectedToRead保持为-1,直到下载完成

c# - EF反向POCO发生器单元测试

c++ - Live555 客户端流媒体内存泄漏

c++ - 使用 engine.h 时,让 Matlab 在命令行窗口中显示错误和输出

c++ - usr/bin/ld : cannot find -l<nameOfTheLibrary>

r - 如何在 R 中从 URL 下载并显示图像?

asp.net-mvc-3 - 在 MVC3 Controller 操作中返回文件和呈现的 View

c# - Entity Framework 4.1 POCO - 多对多加载

c++ - 错误 : no type named 'Unary' in namespace 'ast'

c++ - 您如何将单元测试引入大型的遗留 (C/C++) 代码库?