2016-08-23 82 views
0

我想直接将目录压缩到Poco :: HTTPServerResponse流中。但是,下载由以下代码生成的zip文件会导致损坏的存档。我知道下面的压缩方法对本地创建的zip文件有效,因为我已经成功完成了这些工作。我错过了什么或者这是不可能的? (波索V1.6.1)将Poco Zip压缩到Poco HTTPServerResponse

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

我使用相同的技术成功,只有细微的差别: 的压缩方法和压缩级别(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内部使用头(可能是某种焦油)。一旦你的文件被添加到zip流中并关闭它,Poco就会尝试排列标题,并将输出流的位置重置为开始写入它们。 由于它不能在HTTP输出流上完成(您的字节已经发送!),它会失败。

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