Stažení vygenerovaného XML s dialogem pro uložení

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

Zdravím, zkoumám jak mám vygenerovat nový xml soubor pro stažení (po odeslání formuláře) a nabídnout jej uživateli ke stažení (dialogové okno kde si uživatel vybere cestu a případně změní název souboru před uložením).
V proměnné $r mám xml string. Bohužel u FileResponse musí soubor existovat.

Mám dva file inputy, přes které nahraji 2 xml soubory a pak je podle určitých pravidel spojím a v $r mám výstup, který jen potřebuji nabídnout ke stažení(Objeví se dialogové okno k uložení stahovaného souboru).

 $httpResponse = $this->context->getByType('Nette\Http\Response');

        $httpResponse->setHeader('Pragma', "public");
        $httpResponse->setHeader('Expires', 0);
        $httpResponse->setHeader('Cache-Control', "must-revalidate, post-check=0, pre-check=0");
        $httpResponse->setHeader('Content-Transfer-Encoding', "binary");
        $httpResponse->setHeader('Content-Description', "File Transfer");
//        $httpResponse->setHeader('Content-Length', filesize($r));

        $this->sendResponse(new Nette\Application\Responses\FileResponse($r, 'merge.xml', array('application/octet-stream', 'application/force-download', 'application/download')));

Edit

S touto NoNette variantou mi to funguje

// force download
        header("Content-Type: application/force-download");
        header("Content-Type: application/octet-stream");
        header("Content-Type: application/download");

        // disposition / encoding on response body
        header('Content-Disposition: attachment; filename=export.xml');
        header("Content-Transfer-Encoding: binary");
        header("Cache-control: private"); //use this to open files directly
        header('Expires: 0');
        header("Pragma: no-cache");
        header("Connection: close");
        echo $r;

        $this->terminate();

Ale radši bych použil nějakou nette funkčnost, když už jej tedy používám :D

Editoval Joacim (22. 2. 2016 13:43)

Jan Endel
Člen | 1016
+
0
-

Úplně ti bude stačit použít TextResponse i když bych spíše doporučil vytvořit vlastní XMLResponse a tu od TextResponse podědit a dělat tam ty čachry s hlavičkama.

Joacim
Člen | 229
+
0
-

Jan Endel napsal(a):

Úplně ti bude stačit použít TextResponse i když bych spíše doporučil vytvořit vlastní XMLResponse a tu od TextResponse podědit a dělat tam ty čachry s hlavičkama.

Taky jsem si původně myslel, že jej využiji, ale nevěděl jsem jak na to, zítra to vyzkouším, díky za nakopnutí

Problém je, že nevím jak vynutit aby se vždy ukázalo dialogové okno před stánutím, v chromu se mi soubor sám stáhne po kliknutí, ale FF vyzve k uložením do cesty co vyberu a mužu i přejmenovat

Editoval Joacim (22. 2. 2016 17:55)

CZechBoY
Člen | 3608
+
0
-

V chromu to bude asi jen nastavení prohlížeče :-)

Joacim
Člen | 229
+
0
-

CZechBoY napsal(a):

V chromu to bude asi jen nastavení prohlížeče :-)

To jsem si myslel taky, ale mám i jiné programy které nejsou v nette napsané, ale používají stejnou logiku, přičemž v nette dialog není, ale v ostatních aplikacích je a vždy mám v hlavičce nastaveno attachment

CZechBoY
Člen | 3608
+
0
-

Tak se koukni na HTTP hlavičky a porovnej.