Vygenerování zip souboru a stažení

Upozornění: Tohle vlákno je hodně staré a informace nemusí být platné pro současné Nette.
bluray
Člen | 178
+
0
-

Dobrý den, potřebuji vygenerovat zip soubor a nabídnout uživateli ke stažení. Nejlépe abych ho nemusel nikam na serveru ukládat. Program mi funguje, zip jde stáhnout ale potom to hlásí že je poškozen.
tady je kod:

class ZipDownloader implements IResponse{

    /**
     * Sends response to output.
     * @return void
     */
    public function send(Nette\Http\IRequest $httpRequest, Nette\Http\IResponse $httpResponse) {
        $file = tempnam("tmp", "zip");
        $zipName = 'pokus.zip';
        $zip = new \ZipArchive();
        if ($zip->open($zipName, \ZipArchive::CREATE)!== TRUE)
            throw new InvalidOperationException('Nepodařilo se otevřít zip archiv.');
        $zip->addFromString('soubor.txt', 'Nejaký text');
        $zip->addEmptyDir('ahoj');
        $zip->close();
        $httpResponse->setHeader('Content-Description', 'File Transfer');
        $httpResponse->setContentType('application/zip', 'UTF-8');
        $httpResponse->setHeader('Content-Disposition', 'attachment; filename=' . $zipName);
        $httpResponse->setHeader('Content-Transfer-Encoding', 'binary');
        $httpResponse->setHeader('Expires', 0);
        $httpResponse->setHeader('Cache-Control', 'must-revalidate, post-check=0, pre-check=0');
        $httpResponse->setHeader('Pragma', 'public');
        $httpResponse->setHeader('Content-Length', strlen($zipName));
    }
}

Děkuji za radu

David Matějka
Moderator | 6445
+
0
-

a nema nahodou ten stazeny soubor velikost 0? protoze nikde nevidim, ze bys uzivateli odeslal samotny ten soubor :)

bluray
Člen | 178
+
0
-

No má velikost 0. právě nevím jak ho odeslat. myslel jsem že to řeší header.

h4kuna
Backer | 740
+
0
-

Tohle je taky špatně

<?php
$httpResponse->setHeader('Content-Length', strlen($zipName));
?>

Měla by tam být velikost souboru. Nikoliv počet bajtů potřebných k názvu souboru.

bluray
Člen | 178
+
0
-

a jak tedy ten soubor stáhnu? to ho budu muset někam na serveru nejprve uložit?

h4kuna
Backer | 740
+
0
-

Jelikož voláš

<?php
$zip->open($zipName, \ZipArchive::CREATE);
...
$zip->close();
?>

Tak jsi právě vyrobil soubor. A pak je potřeba udělat jen filesize($cestaKSouboru);

Nevím jak s tím zacvičí tempnam ale doporučuji si nastavit cestu na nettí tempDir.