Autor Zpráva
maarlin
Profil
Zdravím,
lze nějak zjistit typ souboru před jeho samotným uploadem na server?
Vím že existuje proměnná
$_FILES['file']['type']
, ale tam samozřejmě vždy záleží, co předá prohlížeč.
Třeba taková Nokia 6230, nebo SWFUpload u jakéhokoliv souboru vrací "application/octet-stream".

Potřebuji upload omezit na konkrétní typy souborů - obrázky (tzn. type image/*) a několik dalších.

Když pominu ještě méně spolehlivou metodu o příponě souboru, existuje nějaká, která by to trochu spolehlivěji zjistila?

Obávám se, že budu muset soubor nejdříve nauploadovat a pak to nějak zjišťovat via getimagesize();
$size = getimagesize($filename);
echo "Content-type: ".$size['mime'];

Zdá se mi to ale jako zbytečné zatěžování serveru, uploadovat třeba 2MiB soubor a pak ho krátce na to smazat, protože má nevyhovující extension...

Stačí nakopnout... díky :)
Alphard
Profil
S jistotou to nelze, dokud je soubor u uživatele na disku, tak se k němu nedá dostat.
Maximálně můžete nastavit
<input type="file" accept="image/*">
lordfrikk
Profil
Existuje detekce MIME-typu, která se bere přímo ze souboru a nezáleží na tom, jak se soubor jmenuje... MIME typ můžeš zjisti např. za pomocí
<?php $file = finfo_open('tajnysoubor.xxx'); $type = finfo_file($file, FILEINFO_MIME);
.
fuckin
Profil
nejlepsi bude kdyz opendialog s vyberem souboru bude omezen jen na konkretni pripony.
DoubleThink
Profil *
lze nějak zjistit typ souboru před jeho samotným uploadem na server?
Na straně serveru nikoliv - soubor už je součástí samotného multipart požadavku. Můžeš ho maximálně neuložit (nechat chcípnout v dočasné složce)

Na straně klienta můžeš javascriptem přečíst název souboru a rozhodnout se podle koncovky.
denCo
Profil
<?php
if ( !in_array ( $_FILES['file']['type'], array ( "application/x-zip-compressed", "...", "...", "..." ) ) ) {
          $chybova_sprava = "Povolene sú iba formáty bla bla bla";
          break;
        }
?>


mime typy si najdes na
http://www.mimetype.org/



alebo mozes este zistit koncovku suboru, ale to sa da obyst
Jan Tvrdík
Profil
denCo:
Na $_FILES['file']['type'] se nedá spolehnout, protože to posílá prohlížeč (zmíněno i v úvodním příspěvku).
maarlin
Profil
[#2] [#4] Myslel jsem kontrolu na straně serveru...
[#5] ano, máš pravdu, špatně jsem to popsal ale věřím, že to většina ostatních pochopila :)
[#6] Jak jsem psal v prvním příspěvku a jak zmínil [#7], $_FILES['file']['type'] není spolehlivá metoda, které bych se rád vyhnul.

[#3] Dobrý tip! díky, škoda jen, že to není standartní součástí PHP... PECL balík bohužel zatím na běžných hostinzích (tj. ne vlastních virtuálech) není tak běžný.
watchick
Profil
Já osobně si myslím že to udělat nelze, nebot ať posíláš obyčejná post data, nebo posíláš data souboru, server je musí nejprve přijmout, a poté s nimi teprve pracovat
lordfrikk
Profil
[#3] Dobrý tip! díky, škoda jen, že to není standartní součástí PHP... PECL balík bohužel zatím na běžných hostinzích (tj. ne vlastních virtuálech) není tak běžný.

As of PHP 5.3, Fileinfo is shipped with the main distribution and enabled by default. The extension is no longer maintained in PECL.
maarlin
Profil
[#10] Hezká citace, ale kde dnes běžně narazíš na PHP 5.3 ? :) Na to budeme muset ještě chvilku počkat...

Vaše odpověď

Mohlo by se hodit


Prosím používejte diakritiku a interpunkci.

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