Autor Zpráva
xlifer
Profil
Potřebuji v PHP realizovat stažení souboru, který bude vygenerován na vyžádání uživatelem a není tedy nikde umístěn na serveru.

V první kroku provedu autorizaci uživatele a následně mu chci vygenerovat obsah, který pak nabídnu ke stažení jako soubor .txt nebo .csv.

Poradíte jak na to?
Medvídek
Profil
xlifer:
header("Content-Disposition: attachment; filename=".$_GET["stahni"]);   
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/download");
header("Content-Description: File Transfer");            
header("Content-Length: " . filesize("upload/".$_GET["stahni"]));
readfile("upload/".$_GET["stahni"]);
Alphard
Profil
xlifer:
Viz [#2], když chcete obsah generovat, prostě ho vypište na výstup místo readfile().
Jen by bylo dobré znát jeho délku a dát ji do hlavičky na řádku 6. Samozřejmě upravte i filename na 1. řádku.
xlifer
Profil
Takže jestli dobře chápu, tak ten soubor musím stejně někde fyzicky vytvořit na serveru, ve vašem příkladu tedy vytvořím soubor do adresáre upload/ a pak odešlu uživateli.

A nelze soubor vytvořit pouze do proměnné, kterou pošlu přímo ze skriptu abych nemusel vytvářet fyzicky soubor na serveru? Případně, lze takovému souboru nastavit status něco jako dočasný? Jde o to, aby na serveru nezůstával bordel z žádosti uživatelů a mnoho vygenerovaných souborů.
xlifer
Profil
Alphard:

Ano, to je přesně co jsem potřeboval. Příspěvek pod vašim jsem psal, když vy jste psal svůj, takže se tam ptám na to co jste odpověděl...

A budu vypisovat přímo na výstup pomoci echo $data; nebo jinak?
DoubleThink
Profil *
xlifer:
musím stejně někde fyzicky vytvořit na serveru
Ne.

nelze soubor vytvořit pouze do proměnné, kterou pošlu přímo ze skriptu abych nemusel vytvářet fyzicky soubor na serveru
Lze, přesně takhle.

O tom, co prohlížeč se souborem provede, rozhoduje hlavička Content-Type a (v případě IE) také jeho obsah - IE například rádo nabízí DOCX se špatnou hlavičkou ke stažení jako ZIP (protože to je zip).

Medvídek:
application/download
lépe application/x-download, vzhledem k tomu, že tento MIME typ neexistuje.
xlifer
Profil
Takže by skript mohl vypadat takto?

$data = "promena obsahujici vygenerovane data ke stazeni";

header("Content-Disposition: attachment; filename=nazev.csv");   
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/x-download");
header("Content-Description: File Transfer");            
header("Content-Length: ".Strlen($data).");

echo $data;
xlifer
Profil
Nevím jak poslat $data na stažení?

Přes echo $data; se mi data vypisují...

Poradíte? Díky.
Alphard
Profil
Jestli používáte [#7], na 8. řádku chybí uvozovky.
xlifer
Profil
Ano, vím, ale ani tak to nefunguje...

Používám přesně tento kód:

$data = "promena obsahujici vygenerovane data ke stazeni";

header("Content-Disposition: attachment; filename=\"nazev.csv\"");   
header("Content-Type: application/force-download");
header("Content-Type: application/octet-stream");
header("Content-Type: application/x-download");
header("Content-Description: File Transfer");            
header("Content-Length: ".Strlen($data));

echo $data;
xlifer
Profil
A vypadá, že je problém pouze v IE.

Google Chrom, FireFox, Safari i Opera funguje

Co v IE vadí ??
Alphard
Profil
xlifer:
Co v IE vadí ??
Mně nabídlo dialog Uložit / Otevřít / Storno. Dal jsem uložit a vše proběhlo správně. IE 8.
__construct
Profil
xlifer:
Co v IE vadí ??
Ja som to skúšal aj v IE6 a fuguje správne ..
xlifer
Profil
Ano, funguje.

Já testuji na svém lokálním Apache Serveru a zřejmě bude někde něco špatně nastaveného i když netuším co?

Nicméně na hostingu (jiný server) to funguje.

Vaše odpověď

Mohlo by se hodit

Odkud se sem odkazuje


Prosím používejte diakritiku a interpunkci.

Ochrana proti spamu. Napište prosím číslo dvě-sta čtyřicet-sedm:

0