2016-08-23 3 views
0

Ich möchte direkt ein Verzeichnis in einen Poco :: HTTPServerResponse-Stream komprimieren. Das Herunterladen der Zip-Datei, die mit dem folgenden Code erstellt wurde, führt jedoch zu einem beschädigten Archiv. Ich weiß, dass der folgende Komprimierungsansatz für lokal erstellte ZIP-Dateien funktioniert, da ich so viel erfolgreich gemacht habe. Was fehlt mir oder ist das einfach nicht möglich? (Poco v1.6.1)Stream Poco Zip-Komprimierung zu 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(); 

Antwort

1

I die gleiche Technik verwenden, erfolgreich, mit nur einem kleinen Unterschied: Das Kompressionsverfahren und die Kompressionsstufe (CM und CL).

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

Eine Zip-Datei entspricht den DEFLATE Algorithmus, also wenn Entpacken Ihr explorer/Archiv-Manager wahrscheinlich nicht funktioniert. Entweder das, oder es ist sinnlos, eine MAXIMUM-Ebene für eine STORE-Methode zu verwenden (SPEICHERN Sie nicht per Definition komprimieren).

EDIT: Gerade versucht es, tatsächlich, weil CM_STORE intern Header (wahrscheinlich eine Art von Teer) verwendet. Sobald Ihre Dateien dem Zip-Stream hinzugefügt wurden und Sie ihn schließen, versucht Poco, den Header zu sortieren und setzt die Position des Ausgabestreams an den Anfang zurück, um sie zu schreiben. Da dies im HTTP-Ausgabestream nicht möglich ist (Ihre Bytes wurden bereits gesendet!), Schlägt es fehl.

Die Umstellung auf CM_DEFLATE sollte Ihr Problem beheben.