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 159976×
Ú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:
- 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)
- Atribut ACCEPT může omezit typ souboru (nefunguje to ale
vždy)
- 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)
- 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.
- 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.
- 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
|
Příspívat do diskuze mohou pouze registrovaní uživatelé.
|
|

Vyhledávání software

Vyhledávání článků
28.11.2018 23:56 /František Kučera Prosincový sraz spolku OpenAlt se koná ve středu 5.12.2018 od 16:00 na adrese Zikova 1903/4, Praha 6. Tentokrát navštívíme organizaci CESNET. Na programu jsou dvě přednášky: Distribuované úložiště Ceph (Michal Strnad) a Plně šifrovaný disk na moderním systému (Ondřej Caletka). Následně se přesuneme do některé z nedalekých restaurací, kde budeme pokračovat v diskusi.
Komentářů: 1
12.11.2018 21:28 /Redakce Linuxsoft.cz 22. listopadu 2018 se koná v Praze na Karlově náměstí již pátý ročník konference s tématem Datová centra pro business, která nabídne odpovědi na aktuální a často řešené otázky: Jaké jsou aktuální trendy v oblasti datových center a jak je optimálně využít pro vlastní prospěch? Jak si zajistit odpovídající služby datových center? Podle jakých kritérií vybírat dodavatele služeb? Jak volit vhodné součásti infrastruktury při budování či rozšiřování vlastního datového centra? Jak efektivně datové centrum spravovat? Jak co nejlépe eliminovat možná rizika? apod. Příznivci LinuxSoftu mohou při registraci uplatnit kód LIN350, který jim přinese zvýhodněné vstupné s 50% slevou.
Přidat komentář
6.11.2018 2:04 /František Kučera Říjnový pražský sraz spolku OpenAlt se koná v listopadu – již tento čtvrtek – 8. 11. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma umění a technologie, IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
4.10.2018 21:30 /Ondřej Čečák LinuxDays 2018 již tento víkend, registrace je otevřená.
Přidat komentář
18.9.2018 23:30 /František Kučera Zářijový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 20. 9. 2018 od 18:00 v Radegastovně Perón (Stroupežnického 20, Praha 5). Tentokrát bez oficiální přednášky, ale zato s dobrým jídlem a pivem – volná diskuse na téma IoT, CNC, svobodný software, hardware a další hračky.
Přidat komentář
9.9.2018 14:15 /Redakce Linuxsoft.cz 20.9.2018 proběhne v pražském Kongresovém centru Vavruška konference Mobilní řešení pro business.
Návštěvníci si vyslechnou mimo jiné přednášky na témata: Nejdůležitější aktuální trendy v oblasti mobilních technologií, správa a zabezpečení mobilních zařízení ve firmách, jak mobilně přistupovat k informačnímu systému firmy, kdy se vyplatí používat odolná mobilní zařízení nebo jak zabezpečit mobilní komunikaci.
Přidat komentář
12.8.2018 16:58 /František Kučera Srpnový pražský sraz spolku OpenAlt se koná ve čtvrtek – 16. 8. 2018 od 19:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát jsou tématem srazu databáze prezentaci svého projektu si pro nás připravil Standa Dzik. Dále bude prostor, abychom probrali nápady na využití IoT a sítě The Things Network, případně další témata.
Přidat komentář
16.7.2018 1:05 /František Kučera Červencový pražský sraz spolku OpenAlt se koná již tento čtvrtek – 19. 7. 2018 od 18:00 v Kavárně Ideál (Sázavská 30, Praha), kde máme rezervovaný salonek. Tentokrát bude přednáška na téma: automatizační nástroj Ansible, kterou si připravil Martin Vicián.
Přidat komentář
Více ...
Přidat zprávičku
 Poslední diskuze
31.7.2023 14:13 /
Linda Graham iPhone Services
30.11.2022 9:32 /
Kyle McDermott Hosting download unavailable
13.12.2018 10:57 /
Jan Mareš Re: zavináč
2.12.2018 23:56 /
František Kučera Sraz
5.10.2018 17:12 /
Jakub Kuljovsky Re: Jaký kurz a software by jste doporučili pro začínajcího kodéra?
Více ...
|