Autor Zpráva
leonek
Profil
Dobrý den.

Každý tady řeší otázku "Nechci aby se mi zobrazilo okno Otevřít/Uložit".

Já mám opačný problém. Mám soubor.pdf a nechci aby se návštěvníkovy otevřel v prohlížeči, ale aby šel pouze stáhnout.
Nejlépe i bez možnosti "Otevřít", ale pouze "Uložit".

HTML, PHP, JS

Děkuji
Honza.P
Profil
Každý si ten soubor .pdf může otevřít když bude chtít, jediné možné řešení je ten soubor .pdf zabalit do .ZIPu, tím nepůjde otevřít a návštěvník si jej bude muset stáhnout.
Louka
Profil
Pomocí hlavičky jde vynutit ten dialog:
soubor.php
<?php
header('Content-type: application/pdf');
header('Content-Disposition: attachment; filename="downloaded.pdf"');
readfile('original.pdf');
?>

A pak asi musíš odkázat
<a href="soubor.php">Stáhnout</a>



Doplním - "downloaded.pdf" je jméno souboru, co se zobrazí v tom dialogu, "original.pdf" je adresa souboru, který se stahuje.

Snad mě někdo opraví, ale mám pocit že po dobu stahování bude zabrané vlákno PHP procesu, takže pokud server podporuje nějaký maximální počet paralelních vláken, tímto se jedno "odstřihne" (takže podporuje-li server max 10 vláken, tak pokud bude stahovat najednou 10 lidí, nikdo se na web nedostane, dokud aspoň jedno stahování neskončí).
weroro
Profil
Nie je to najšťastnejšie riešenie ale pre ako takú bezpečnosť si daj tie PDF do priečinka share
<?php
$subor = "share/". basename($_GET['file']);

if(! file_exists($subor))
 die("Subor <b>".basename($_GET['file'])."</b> neexistuje ");

header("Content-Description: File Transfer");
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=\"$subor\"");

readfile ($subor);
?>

PDFko potom stiahneš tak, že to zapíšeš ako: subor.php?file=subor.pdf
leonek
Profil
Honza.P:
zabalit do .ZIPu, tím nepůjde otevřít a návštěvník si jej bude muset stáhnout
Nechci obtěžovat uživatele rozbalováním zipu

weroro:
Jde mi jen o jeden konkrétní soubor v kořenovém adresáři. (statické stránky)
doplněk: ale děkuji za tip, napdlo mě použit váš kód s tím že budu odkazovat na stejnou stranku _POSTem
Keeehi
Profil
Louka:
Nevím, jak je to udělané a na simulaci zatím nemám čas, ale zdá se mi, že to takto nefunguje. Můj názor je takový, že funkce readfile vezme data z disku a přepošle je na standardní výstup a tím končí. Tato operace by měla být podle mého názoru poměrně rychlá. A pak už skončí script a následně i jeho vlákno. To že pak data k člověku cestují pomalu a tudíž nějaký soubor stahuje třeba hodinu, to už je podle mě věc jiná.
Louka
Profil
Keeehi:
Vím, že takovýmto "problémem" (i když spíše je to "feature" ;-)...) trpí funkce file_get_contents() a file_put_contents(), u readfile právě jistotu nemám.
leonek
Profil
Použil jsem poupravené werorovo řešení. Bohužel jsem narazil na druhý problém, kterým je tlačítko button v IE. Odesílá mi totiž ne hodnotu value ale samotný text uvnitř tagu.

<form action="kontakt.php" method="post">
  <button type="submit" name="soubor" value="nazev.pdf">Stáhnout soubor</button>  
</form>

v IE přijde:
$_POST['soubor'] = Stáhnout soubor
Chamurappi
Profil
Reaguji na leonka:
Odesílá mi totiž ne hodnotu value ale samotný text uvnitř tagu.
To je původní fungování <button>u. Ostatní prohlížeče používají nový způsob, kdy posílají value. Řešení je prosté — nepoužívat k předávání informací <button>.
Keeehi
Profil
leonek:
Neboli použít input hidden a input submit.
leonek
Profil
Ano, to jsem také použil, vše již funguje jak má. Děkuji všem za příspěvky, zejména Loukovi (pardon :) a Werorovy.
Louka
Profil
leonek:
Offtopic, ale musím to zmínit - jsem ten Louka (=Loukovi). Děkuji za pozornost :D.

Vaše odpověď


Prosím používejte diakritiku a interpunkci.

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