流Poco Zip压缩到Poco HTTPServerResponse

时间:2016-08-23 23:59:52

标签: zip poco

我想直接将目录压缩为Poco :: HTTPServerResponse流。但是,下载由以下代码生成的zip文件会导致存档损坏。我知道下面的压缩方法适用于本地创建的zip文件,因为我已经成功完成了这么多。我错过了什么或者这根本不可能? (Poco v1.6.1)

std::string directory = "/tmp/data";
response.setStatusAndReason(HTTPResponse::HTTPStatus::HTTP_OK);
response.setKeepAlive(true);
response.setContentType("application/zip");
response.set("Content-Disposition","attachment; filename=\"data.zip\"");
Poco::Zip::Compress compress(response.send(),false);
compress.addRecursive(directory,
    Poco::Zip::ZipCommon::CompressionMethod::CM_STORE,
    Poco::Zip::ZipCommon::CompressionLevel::CL_MAXIMUM,
    false, "data");
compress.close();

1 个答案:

答案 0 :(得分:2)

我使用相同的技术成功,只有一点点差别: 压缩方法和压缩级别(CM和CL)。

compress.addFile( cacheFile, Poco::DateTime(), currentFile.GetName(), Poco::Zip::ZipCommon::CM_DEFLATE, Poco::Zip::ZipCommon::CL_SUPERFAST );

zip文件对应于DEFLATE算法,因此在解压缩时,您的资源管理器/存档管理器可能无法解决问题。 要么是这样,要么在STORE方法上使用MAXIMUM级别是没有意义的(根据定义存储非压缩)。

编辑:刚试过它,实际上,它是因为CM_STORE内部使用标题(可能是某种tar)。将文件添加到zip流并关闭它后,Poco会尝试对标题进行排序,并将输出流的位置重置为开头以编写它们。 因为它不能在HTTP输出流上完成(你的字节已经发送了!),它就会失败。

切换到CM_DEFLATE可以解决您的问题。