2016-08-23 22 views
0

ディレクトリをPoco :: HTTPServerResponseストリームに直接圧縮したいと思います。ただし、次のコードで生成されたzipファイルをダウンロードすると、破損したアーカイブが作成されます。私は、以下の圧縮アプローチがローカル作成のZIPファイルでうまくいくことを知っています。私は何が不足しているのですか、これは単に不可能ですか? (ポコのv1.6.1)私はわずかな差が、正常に同じ技術を使用Poco HTTPServerResponseへのストリームPoco Zip圧縮

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レベルを使用するのは意味がありません(定義によって非圧縮のSTORE)。

EDIT:CM_STOREが内部的にヘッダ(おそらく何らかのタール)を使用しているからです。あなたのファイルがzipストリームに追加され、それを閉じると、Pocoはヘッダを整列しようとし、出力ストリームの位置を開始位置にリセットして書き込みます。 HTTP出力ストリームでは実行できないため(バイトはすでに送信されています)、失敗します。

CM_DEFLATEに切り替えて問題を解決する必要があります。