我想直接将一个目录压缩成一个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();发布于 2016-12-21 23:53:18
我成功地使用了相同的技术,只是稍有不同:压缩方法和压缩级别(CM和CL)。
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应该可以解决您的问题。
https://stackoverflow.com/questions/39112433
复制相似问题