Zjištění typu souboru

Školení, která pořádám

Pokud potřebujeme zjistit, jakého typu je soubor poslaný uživatelem, máme několik možností:

Odhadnout to podle koncovky
Pokud ale uživatel dá souboru jinou koncovku, než je obvyklé, tak tento způsob nebude fungovat.
Spolehnout se na $_FILES['userfile']['type']
Typ je nastaven prohlížečem podle koncovky souboru, takže tento způsob nebude fungovat jednak v případě špatné koncovky a jednak v případě špatně nastaveného typu v prohlížeči uživatele.
Rozhodnout se na základě obsahu souboru
To zajistí např. u obrázků funkce getimagesize, obecně mime_content_type nebo novější rozšíření Fileinfo.

Poslední způsob neanalyzuje celý soubor, ale pouze v něm hledá určité znaky typické pro daný typ souboru, takže se dá taky zmást, z uvedených způsobů je ale i tak nejspolehlivější. U funkce mime_content_type a rozšíření Fileinfo hraje klíčovou roli soubor s definicemi souborů magic.mime. Ten může být součástí operačního systému nebo je obsažen v distribuci Apache nebo PHP pro Windows.

<?php
$finfo = new finfo();
echo $finfo->file($_FILES["userfile"]["tmp_name"]);
?>
Jakub Vrána, Řešení problému, 28.4.2006, diskuse: 5 (nové: 0)

Diskuse

tobik:

Když budu mít ve složce třeba desítky souborů a budu potřebovat rozlišit typ souboru, bude rychlejší Fileinfo nebo pomocí textových fcí separovat koncovku a podle ní určit typ? V mém případě jde o to určit typ souboru přibližně (např. kvůli vybrání ikonky...).

ikona Jakub Vrána OpenID:

V tom případě bych použil koncovku.

krteczek:

no vypadá to zajímavě, jen mám takový divný pocit, že ještě hoooodně dlouho budeme psát skripty stylem:

<?php
if(class_exists("finfo"))
{
   //použije se finfo
}
else
{
   //použije se mime_content_type
}
?>

Nethor:

' $_FILES['userfile']['type']
Typ je nastaven prohlížečem podle koncovky souboru '
To není pravda, hodnota závisí na hlavičce souboru,
ne na příponě. Pokud je vpřádku uploadovaný soubor, funguje to spolehlivě i při chybné koncovce. (vyzkoušeno)

ikona Jakub Vrána OpenID:

Záleží to na operačním systému uživatele, který soubor nahrává. Na Windows to je skutečně podle koncovky, na Linuxu typicky podle obsahu. Každopádně se to nastavuje u klienta a nikoliv na serveru, takže se na to spolehnout skutečně nedá.

Diskuse je zrušena z důvodu spamu.

avatar © 2005-2024 Jakub Vrána. Publikované texty můžete přetiskovat pouze se svolením autora. Ukázky kódu smíte používat s uvedením autora a URL tohoto webu bez dalších omezení Creative Commons. Můžeme si tykat. Skripty předpokládají nastavení: magic_quotes_gpc=Off, magic_quotes_runtime=Off, error_reporting=E_ALL & ~E_NOTICE a očekávají předchozí zavolání mysql_set_charset. Skripty by měly být funkční v PHP >= 4.3 a PHP >= 5.0.