LINUXSOFT.cz Přeskoč levou lištu
Uživatel: Heslo:  
   CZUKPL

> PHP (31) - Upload a download souborů

Dnes si ukážeme, jak s pomocí PHP dostat soubor na server a naopak jak soubory ze serveru stahovat.

30.7.2004 15:00 | Petr Zajíc | Články autora | přečteno 150681×

Komerční sdělení: Pořádáme Kurzy PHP

Úvod je trochu nadnesený. Rychle zjistíte, že nahrávání souboru na server ani jeho stahování není záležitostí samotného PHP, jako spíše využití některých možností, které nám nabízí HTML. Líbilo se mi ale zařadit tuto látku do seriálu o PHP, protože často to v takových seriálech chybí a museli bychom to hledat někde jinde. Začneme stahováním souborů, je to jednodušší.

Stahování souborů ze serveru

Prohlížeče mohou rozumět různým typům souborů. Tak například jestliže klepnete na odkaz vedoucí na stránku html, pokusí se ji prohlížeč najít a zobrazit. Zatímco třeba klepnutí na odkaz vedoucí k souboru zip nejspíš povede k jeho stažení. Problém může nastat v případě, kdy chceme prohlížeč přemluvit, aby stáhnul jako soubor něco, co by normálně zobrazil. Například, máme na serveru soubor 31_test.html. Jestliže jste kliknuli na odkaz, prohlížeč Vám ho téměř jistě zobrazil.

Stáhnout jej můžete tak, že prohlížeči vysvětlíte, že má soubor považovat za přílohu. Odkaz nepovede na samotný soubor html, ale na soubor PHP, který nejprve přemluví prohlížeč, aby soubor stáhl, a pak to udělá. Soubor php může vypadat následovně:

<?
$soubor
= "31_test.html";

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

readfile ($soubor);
?>

Spustit skript

Trik spočívá v přidání hlaviček, které se pokusí vysvětlit prohlížečům, že mají se souborem zacházet jako s něčím ke stažení a ne to zobrazovat. Pozor, zase platí, že k souboru musíme mít minimálně právo pro čtení, abychom jej mohli stáhlout. Různé prohlížeče se k tomuto postupu postaví různě, ale je to lepší než nic.

Pozn.: V reálné aplikaci bychom zřejmě místo proměnné $soubor, která je zde nastavena "natvrdo" použili funkci a umožnili bychom tak stahovat například soubor předaný jako parametr. V příkladu to není úmyslně, je to potenciální bezpečnostní díra do souborového systému webu.

Uvědomte si rovněž, že to, co chceme stahovat vůbec nemusí předtím existovat jako soubor na serveru. Následující skript například vytvoří a nabídne ke stažení údaj s aktuálním datem a časem serveru:

<?
header
("Content-Description: File Transfer");
header("Content-Type: application/force-download");
header("Content-Disposition: attachment; filename=\"datum.txt\"");
echo
date("r");
?>

Spustit skript

Je jasné, že takový trik se může hodit když potřebujeme nějaké informace nabídnout uživateli ke stažení, přičemž třebas nemáme možnost na serveru vytvářet soubory.

Nahrávání souborů na server

To je vlastně opačný problém. PHP samo o sobě umožňuje zapisovat soubory na server pomocí protokolu ftp nebo http, pokud je to povoleno. Takže, následující kód by vytvořil soubor a zapsal do něj požadované informace:

<?
$fp
= fopen ("ftp://[uzivatel]:[server]/test.txt", "w");
fwrite ($fp, "Nějaký text");
fclose ($fp);
?>

Moc se ale neradujte. Aby to fungovalo, měly by být splněny následující požadavky:

  • Nastavení PHP na Vašem serveru musí otevírání souborů pomocí FTP podporovat
  • Server FTP musí podporovat běh v pasivním režimu
  • Můžete otevírat soubory buď pro čtení, nebo pro zápis, ale ne obojí

Na druhou stranu tak můžete otevřít soubor na druhé straně zeměkoule, takže zajímavá metoda je to rozhodně.

Pokud budete chtít uploadovat soubor z počítače, u něhož právě sedíte, můžete využít toho, že nahrávat soubory lze pomocí formulářů. Asi takhle:

<?
if ($_REQUEST["odeslano"]==1):
  
unlink ("./31/hloupost.txt");
  
// kontroly...
  
if (move_uploaded_file($_FILES['hloupost']['tmp_name'], "./31/hloupost.txt"))
  {
    
//zpracování
  
};
else:
?>
    Nahrání souboru na server
    <form method="POST" ENCTYPE="multipart/form-data" action="<?echo $_SERVER["PHP_SELF"]?>">
    <table border="1" >
      <tr>
        <td>Textový soubor</td>
        <td>
        <input type="HIDDEN" name="MAX_FILE_SIZE" VALUE=300>
        <input type="file" name="hloupost" ACCEPT="text/*">
        </td>
        <td>(max. 300 bajtů)</td>
      </tr>
      <tr>
        <td colspan="3">
              <input type="hidden" name="odeslano" value="1">
          <p align="center"><input type="submit" value="Odeslat"></td>
      </tr>
    </table>
    </form>
<?
endif;
?>

Ukázat celý skript | Spustit skript

Formuláře totiž mohou obsahovat prvky typu FILE, které způsobí odeslání souboru na server. Zobrazte si celý skript, trochu si jej rozebereme. Probíhá to v následujících krocích:

  1. Při vyplnění formuláře uživatel vybere soubor. Skryté pole MAX_FILE_SIZE přitom může omezit jeho velikost (nefunguje to ale vždy)
  2. Atribut ACCEPT  může omezit typ souboru (nefunguje to ale vždy)
  3. Nastává slavná chvíle odeslání dat na server. Tam se soubor(y) uloží do nějaké dočasné složky (nemusíte se o to starat, je to dáno nastavením systému a/nebo PHP)
  4. Seznam souborů máte k dispozici ve dvojrozměrném asociativním poli. První rozměr pole se musí jmenovat stejně jako se jmenuje odpovídající prvek INPUT ve formuláři. V našem případě tedy hloupost.  Druhý rozměr pole může nabývat hodnot "name", "type", "size" a "tmp_name". Jejich význam je celkem zřejmý; tmp_name je název na cílovém systému, name na zdrojovém.
  5. Skript musí soubor nějak zpracovat. Nejčastěji se přesouvá z dočasné složky někam jinam. Funkce move_uploaded_file je bezpečnější než copy, takže byste ji měli použít.
  6. Ať už skript udělá se souborem cokoli, po ukončení běhu skriptu je dočasný soubor smazán. (Pakliže byl zkopírován, v cílovém umístění pochopitelně zůstane).

Pozn.: V našem případě prostě soubor vypisujeme, abyste se ujistili, že skutečně dorazil na server. Jelikož je to ale příklad, každý další soubor nahradí ten předchozí, abychom zbytečně neplýtvali místem na serveru.

Příště si ukážeme, jak soubory pomocí PHP komprimovat a dekomprimovat a celý kus seriálu zakončíme návodem, jak si udělat blog.

Verze pro tisk

pridej.cz

 

DISKUZE

komentare 2.8.2004 12:31 Rišo Marko
L Re: komentare 2.8.2004 12:33 Rišo Marko
enctype 2.12.2004 17:09 Jiří Hnídek
L Re: enctype 30.12.2004 09:32 Petr Zajíc
upload souboru - problem s pravy 2.2.2006 23:52 Domek
L Re: upload souboru - problem s pravy 3.2.2006 08:19 Petr Zajíc
&quot;./31/hloupost.txt&quot; 20.3.2006 11:18 Radin Černý
L Re: &quot;./31/hloupost.txt&quot; 20.3.2006 14:17 Petr Zajíc
  L Re: &quot;./31/hloupost.txt&quot; 11.7.2007 14:54 jan jarÄŤĂ­k
    L Re: &quot;./31/hloupost.txt&quot; 11.7.2007 17:48 Petr Zajíc
      L Re: &quot;./31/hloupost.txt&quot; 12.7.2007 13:17 jan jarÄŤĂ­k
File-Upload u aplikace Client-Server 3.4.2006 10:59 Radin Černý
|- Re: File-Upload u aplikace Client-Server 3.4.2006 19:28 Ondřej Čečák
L Re: File-Upload u aplikace Client-Server 23.10.2006 18:22 Roman Rakus
Download &amp; koncovka v IE 17.4.2006 20:21 Petr Menšík
L Re: Download &amp; koncovka v IE 25.11.2006 12:23 Stepan Novak
Download souboru při použití session 22.11.2006 18:04 Milan Drahovzal
L Re: Download souboru při použití session 22.11.2006 20:23 Petr Zajíc
  L Re: Download souboru při použití session 23.11.2006 11:38 Milan Drahovzal
upload 2x 14.1.2008 18:23 aaaaaaaa
L Re: upload 2x 10.6.2011 10:33 Filip Vincůrek
uživatel/server 23.2.2008 16:29 Dan Pelíšek
L Re: uživatel/server 23.2.2008 22:48 Ondřej Čečák
  |- Re: uživatel/server 24.2.2008 00:32 Dan Pelíšek
  L Re: uživatel/server 24.2.2008 00:44 Dan Pelíšek
    L Re: uživatel/server 24.2.2008 03:51 Aleš Hakl
      L Re: uživatel/server 24.2.2008 03:53 Aleš Hakl
        L Re: uživatel/server 24.2.2008 09:18 Dan Pelíšek
Bezpečný odkaz 2.9.2008 12:51 Aleš Stárek
L Re: Bezpečný odkaz 18.9.2008 16:00 Aleš Hakl
  L Re: Bezpečný odkaz 22.9.2008 20:22 Aleš Stárek
Stahování obrázku 18.9.2008 14:40 Tomáš Kučera
L Re: Stahování obrázku 18.9.2008 16:01 Aleš Hakl
Velké soubory 14.6.2009 16:30 Aleš Stárek
L Re: Velké soubory 15.6.2009 19:14 Aleš Stárek
JPEG z url adresy jiného webu 10.6.2011 10:17 Filip Vincůrek




Příspívat do diskuze mohou pouze registrovaní uživatelé.
> Vyhledávání software
> Vyhledávání článků

15.5.2017 23:50 /František Kučera

Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě DIY, CNC, SDR nebo morseovka? Přijď na sraz spolku OpenAlt, který se bude konat ve čtvrtek 18. května od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5).


Přidat komentář

12.5.2017 16:42 /Honza Javorek
PyCon CZ, česká konference o programovacím jazyce Python, se po dvou úspěšných ročnících v Brně bude letos konat v Praze, a to 8. až 10. června. Na konferenci letos zavítá např. i Armin Ronacher, známý především jako autor frameworku Flask, šablon Jinja2/Twig, a dalších projektů. Těšit se můžete na přednášky o datové analytice, tvorbě webu, testování, tvorbě API, učení a mentorování programování, přednášky o rozvoji komunity, o použití Pythonu ve vědě nebo k ovládání nejrůznějších zařízení (MicroPython). Na vlastní prsty si můžete na workshopech vyzkoušet postavit Pythonem ovládaného robota, naučit se učit šestileté děti programovat, efektivně testovat nebo si v Pythonu pohrát s kartografickým materiálem. Kupujte lístky, dokud jsou.
Přidat komentář

2.5.2017 9:20 /Eva Rázgová
Putovní konference československé Drupal komunity "DrupalCamp Československo" se tentokrát koná 27. 5.2017 na VUT FIT v Brně. Můžete načerpat a vyměnit si zkušenosti z oblasti Drupalu 7 a 8, UX, SEO, managementu týmového vývoje, využití Dockeru pro Drupal a dalších. Vítáni jsou nováčci i experti. Akci pořádají Slovenská Drupal Asociácia a česká Asociace pro Drupal. Registrace na webu .
Přidat komentář

1.5.2017 20:31 /Pavel `Goldenfish' Kysilka
PR: 25.5.2017 proběhne v Praze konference na téma Firemní informační systémy. Hlavními tématy jsou: Informační systémy s vlastní inteligencí, efektivní práce s dokumenty, mobilní přístup k datům nebo využívání cloudu.
Přidat komentář

15.4.2017 15:20 /František Kučera
Máš rád svobodný software a hardware nebo se o nich chceš něco dozvědět? Zajímá tě IoT a radiokomunikace? Přijď na sraz spolku OpenAlt, který se bude konat ve středu 19. dubna od 18:30 v Šenkovně (Sokolská 60, Praha 2).
Přidat komentář

5.3.2017 19:12 /Redakce Linuxsoft.cz
PR: 23. března proběhne v Praze konferenci na téma Cloud computing v praxi. Hlavními tématy jsou: Nejžhavější trendy v oblasti cloudu a cloudových řešení, Moderní cloudové služby, Infrastruktura současných cloudů, Efektivní využití cloudu, Nástrahy cloudových řešení a jak se jim vyhnout.
Přidat komentář

27.2.2017 22:12 /František Kučera
Pozvánka na 137. sraz OpenAlt – Praha: Tentokrát jsme si pro vás připravili neobvyklou akci. Ve středu 1.3. v 17:30 nás přivítá sdružení CZ.NIC ve svých prostorách v Milešovské ulici číslo 5 na Praze 3, kde si pro nás připravili krátkou prezentaci jejich činnosti. Následně navštívíme jejich datacentrum pod Žižkovskou věží. Provedou nás prostory, které jsou běžnému smrtelníkovi nedostupné!
Po ukončení prohlídky se všchni odebereme do hostince U vodoucha, Jagelonská 21, Praha 3 pochutnat si na některém z vybraných piv či dát si něco na zub. Rezervaci máme od 19:30, heslo je OpenAlt.
Ale pozor! Do prostor datového centra máme omezený přístup, dostane se tam pouze 10 lidí! Takže kdo přijde dříve, ten má přednost, a občanky s sebou! Kdo nebude chtít na prohlídku datového centra, může se pomalu přesunout do hostince U vodoucha a u nepřeberné nabídky piv počkat na ostatní.
Přidat komentář

18.1.2017 0:49 /František Kučera
Členové a příznivci spolku OpenAlt se pravidelně schází v Praze a Brně. Fotky z pražských srazů za uplynulý rok si můžete prohlédnout na stránkách spolku. Příští sraz se koná už 19. ledna – tentokrát je tématem ergonomie ovládání počítače – tzn. klávesnice, myši a další zařízení. Také budete mít příležitost si prohlédnout pražský hackerspace Brmlab.
Přidat komentář

   Více ...   Přidat zprávičku

> Poslední diskuze

15.6.2017 9:34 / Ondřej Havlas
php,

10.6.2017 10:39 / Temple
sell home for cash

11.5.2017 23:32 / lelo
Re: Problém se správcem balíčků

11.5.2017 5:45 / davd mašek
Re: Problém se správcem balíčků

10.5.2017 22:54 / lelo
Re: Problém se správcem balíčků

Více ...

ISSN 1801-3805 | Provozovatel: Pavel Kysilka, IČ: 72868490 (2003-2017) | mail at linuxsoft dot cz | Design: www.megadesign.cz | Textová verze