T&R splet blog o spletnih storitvah. Razgaljamo tehnologijo!

reference spletnih strani
26th October

PHP – kako ugotoviti tip datoteke (get file extension type)

Vsak od nas, ki se je vsaj malo ukvarjal z PHP-jem je moral pogledati kakšen tip datoteke je bil podan aplikaciji. Zato obstaja veliko načinov, poglejmo si nekaj najbolj uporabljenih (nekateri moji, nekateri pobrani z drugih spletnih strani):

#1 strrpos način

PHP:
  1. substr($filename, strrpos($filename, '.') + 1);

#2 uporaba pathinfo funkcije

PHP:
  1. pathinfo($filename, PATHINFO_EXTENSION);

#3 strrchr način

PHP:
  1. substr(strrchr($filename, '.'), 1);

#4 explode in end način, ne prestane E_STRICT standarda (Only variables should be passed by reference)

PHP:
  1. end(explode(".", $filename));

#5 preg replace

PHP:
  1. preg_replace('/^.*\.([^.]+)$/D', '$1', $filename);

Kot dodatno pa lahko za slike dobimo mime-type z pomočjo getimagesize funkcije:

PHP:
  1. $test = getimagesize($filename);

Meni najbolj všečna metoda je zagotovo pathinfo s katero lahko dobimo tudi druge podatke. Več o tej funkciji si preberite na PHP strani. Najhitrejši med njimi pa je strrchr način. No vsaj tako pravijo, sam tega nisem preizkusil.

Zgoraj omenjeni načini pa imajo eno napako in sicer tip datoteke dobijo glede na ime datoteke. Torej, če uporabnik želi pretentati sistem mora le preimenovati datoteko (spremeniti končnico). To velja za vse funkcije razen getimagesize, ki se ne zanaša na ime datoteke ampak prebere prvih nekaj bytov in na podlagi teh podatkov skuša ugotoviti tip slike.

Delno lahko problem rešimo tako, da z dobljeno datoteko poskusimo kreirati PHP resource s pomočjo createimagefromjpeg (če je datoteka tipa jpeg), ki nam nato vrne false v primeru, da slika ni tipa JPEG, vendar to lahko naredimo le za določene tipe datotek (slike), pa še rešitev ni ravno perfektna.

Uporaba operacijskega sistema in uporaba exec funkcije:

PHP:
  1. trim ( exec ('file -bi ' . escapeshellarg ($file)))

Tip datoteke dobimo s pomočjo operacijskega sistema. Tukaj zna biti težava, ker včasih vrne čudno vrednost, recimo enkrat audio/x-ms-wma drugič application/octet-stream za isti tip datoteke (.wmv). Dodatno pa je problem exec funkcija, ki je pri nekaterih shared gostovanjih onemogočena.

Drugi način pa je uporaba fileinfo knjižnice. Sicer ni široko podprta na strežnikih vendar bo tudi ta težava kmalu odpravljena saj bo PHP6 že privzeto vključevala omenjeno knjižnico. Torej, če se ne želite zanašati na ime datoteke potem uporabite sledeči extension. Moram pa opozoriti, da zadeva ni 100%, vendar bo najverjetneje zadostovala vašim potrebam.

Dodatne informacije:

Kako pa se vi borite proti zlorabi datotek, če sploh? Sporočite vaš najbolj priljubljen način in v primeru, da poznate kakšen uber postopek le na dan z njim.

Deli s skupnostjo:

  • Print
  • Digg
  • Sphinn
  • del.icio.us
  • Facebook
  • Mixx
  • Google Bookmarks

Podobni članki:

  1. Shrani datoteko / Odpri datoteko dialog – download center (mime-type, Content-type, Content-Disposition)
  2. Spreminanje input type text v input type password – Javascript
  3. PHP – namestitev SQL Server 2005 knjižnice (SQLSRV extension)
  4. Preprosta skripta – kreiranje Excel datoteke iz PHP tabele/array
  5. PHP – Kreiranje PDF datoteke – DOMPDF – TCPDF
  6. AJAX iskanje datotek, dodajanje v seznam ter predogled le teh (PDF, jpeg)
  7. PHP – pošiljanje emaila – epošte – sending email – HTML Mime Mail
  8. PHP – branje Excel (.xls) datoteke – Excel UTF8 branje
  9. Predogled PDF-ja – pretvorba PDF v jpeg s pomočjo PHP-ja
  10. HTML Mime Mail PHP – nastavljanje kodne tabele (charset – windows-1250 – UTF-8) – Outlook Express

6x komentirano na “PHP – kako ugotoviti tip datoteke (get file extension type)”

  1. Uroš Pirnat je napisal:

    Odvisno od tega, kateri tip datoteke je. Pri nekaterih tipih lahko preveriš MIME.

  2. Roky je napisal:

    Pirnat, malce več povej okrog tega, si zelo skopo tole povedal ... Za katere tipe datotek misliš, na kakšen način, je zanesljiv (se ne zanaša na ime datoteke ampak poskuša ugotoviti iz same vsebine datoteke, itd?).

  3. gasper_k je napisal:

    Še en način je fileinfo.

  4. Roky je napisal:

    gasper_k, ja sem ga tudi omenil, na koncu. Tnx anyway.

  5. gasper_k je napisal:

    ah, sori, sem spregledal. Očitno cel odstavek :/ bom bolj pozoren drugič :)

  6. Roky je napisal:

    Ni pene:)

Dodaj komentar