首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >流Poco Zip压缩到Poco HTTPServerResponse

流Poco Zip压缩到Poco HTTPServerResponse
EN

Stack Overflow用户
提问于 2016-08-24 07:59:52
回答 1查看 724关注 0票数 2

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

代码语言:javascript
复制
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();
EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2016-12-21 23:53:18

我成功地使用了相同的技术,只是稍有不同:压缩方法和压缩级别(CM和CL)。

代码语言:javascript
复制
compress.addFile( cacheFile, Poco::DateTime(), currentFile.GetName(), Poco::Zip::ZipCommon::CM_DEFLATE, Poco::Zip::ZipCommon::CL_SUPERFAST );

zip文件对应于DEFLATE算法,因此在解压缩时,您的资源管理器/归档管理器可能无法正常工作。或者,在STORE方法上使用最大级别是没有意义的(根据定义,STORE是非压缩的)。

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

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

票数 3
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/39112433

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档