Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Mime type z pliku na serwerze
Forum PHP.pl > Forum > PHP
franki01
Witam.

Mam pytanie. Czy mozna jakos inaczej pobrac typ mime pliku, ktory znajduje sie na moim serwerze, niz wykorzystanie mime_content_type() i finfo_file()? Bo na linuxpl.com zadna z tych funkcji nie jest obslugiwana i mam dylemat ;p Nigdzie niestety nie pisze o innych rozwiazaniach sad.gif

Pozdrawiam, Franki
Sedziwoj
dla obrazków:
getimagesize() -> image_type_to_mime_type,

a jak nie... no cóż kiedyś się tym chciałem pobawić, musisz mieć plik "magic.mime" który zawiera sygnatury plików, a potem go zinterpretować i porównać z posiadanym.
Ja mam spreparowany plik, bo jakoś nie znalazłem standardu i się niektóre wiersze wywalały... jak chcesz kod interpretujący i szukający od razu typu to mogę wrzucić, ale to jest stare i syfiaste (ale działa w miarę dobrze).
Nie wrzucam, bo wstydzę się kodu a ma do tego prawie 90lini bez komentarzy (prawie).
kwiateusz
właśnie ja też szukałem i niestety wbudowanego w php nie ma innego odpowiednika, ale zawsze są zew. klasy winksmiley.jpg
np
http://www.phpclasses.org/browse/file/2743.html
http://www.phpclasses.org/browse/package/3051.html
Sedziwoj
@kwiateusz tylko że mój skrypt operuje na prawdziwym rozpoznawaniu mime, tzn na podstawie sygnatury, która zawsze jest w pliku danego typu. Możesz dać plik o nazwie 'aaa' do skryptu a on powie jaki jest rzeczywisty typ.

A oba skrypty co podałeś bazują na rozszerzeniach, może wystarczy, a może nie. Polecenia wbudowane w język bazują na sygnaturach, więc chyba jednak takie jest pewniejsze.
(ta kwestia była poruszana przy weryfikacji plików z upload, bo mime ten który dostajemy to jest z 'przeglądarki' więc może być podszyty, tak jak rozszerzenie)

EDIT lit.
franki01
Wlasnie o to chodzi zeby mime nie bylo oparte o rozszerzenie pliku. Bo mam takie cos: file.php?id=## (## to liczba) i chodzi mi zeby pobrac typ mime tego pliku. Niekoniecznie musi to byc obrazek, wiec image_type_to_mime_type odrzucilem juz na poczatku, a inne funkcje nie dzialaja na serwerze. Jedyne chyba co pozostaje zrobic to poprosic administratorow o wlaczenie finfo_* (jezeli potrzebne jest zainstalowanie nowego modulu) winksmiley.jpg Ale dzieki za pomoc biggrin.gif
Sedziwoj
Albo czytanie i użycie słowa proszę ;P
  1. <?php
  2. # Magic data for KMimeMagic (originally for file(1) command)
  3. #
  4. # The format is 4-5 columns:
  5. # Column #1: byte number to begin checking from, ">" indicates continuation
  6. # Column #2: type of data to match
  7. # Column #3: contents of data to match
  8. # Column #4: MIME type of result
  9. # Column #5: MIME encoding of result (optional)
  10. function moja ($aa) {
  11. return chr(hexdec($aa[1]));
  12. }
  13. function ddd ($aa) {
  14.  return dechex(ord($aa[1]));
  15. }
  16. function decimal($liczba) {
  17.  $wynik = '';
  18.  if ($liczba>256){
  19. do{
  20.  $reszta = $liczba%256;
  21.  $calosc = ($liczba-$reszta)/256;
  22.  $wynik = addslashes( chr($reszta) ).$wynik;
  23.  $liczba = $calosc;
  24. } while( $liczba != 0 );
  25.  }else {
  26. $wynik = chr($liczba);
  27.  }
  28.  return $wynik;
  29. }
  30. function hexadecimal ($aa) {
  31.  return decimal(base_convert($aa[1], 16, 10));;
  32. }
  33. function octal ($aa) {
  34.  return decimal(base_convert($aa[1], 8, 10));;
  35. }
  36. while (!$plik = file("magic.mime")){usleep(100000);}
  37. $size = count($plik);
  38. $topt = "sciezka_do_pliku";
  39. $fp = fopen($topt,"r");
  40. $znalazl = false;
  41. for ( $i=0; $i<$size; $i++ ) {
  42.  if ( preg_match( '/^#/', trim($plik[$i]) ) ){
  43. continue;
  44.  }
  45.  preg_match('@^((?:[0-9]+|(?snitch.gif[0-9]+)))(?:[t ]+)([^t]+)(?:[t ]+)((?:[^t ]|(?:.))+)(?:[t ]+)((?:[^t ]|(?:.))+)(?:[t ]*)(.*)@i',trim($plik[$i]),$to);
  46.  preg_match('/^>?([^>]*)/',$to[1],$x);
  47.  fseek($fp, $x[1]);
  48.  switch ($to[2]) {
  49. case "string" :
  50. $to[3] = preg_replace_callback('/[xX]([0-9a-fA-F]{2})/','hexadecimal',$to[3]);
  51. $to[3] = preg_replace_callback('/([0-7]{3})/','octal',$to[3]);
  52. $co = fread($fp, strlen($to[3]));
  53. if ($co == $to[3]) {
  54.  $znalazl = true;
  55.  echo stripslashes($to[4]);
  56. }
  57.  break;
  58. case "lelong" : $dl=isset($dl)?$dl:4;
  59. case "byte" : $dl=isset($dl)?$dl:1;
  60. case "belong" : $dl=isset($dl)?$dl:4;
  61. case "short" : $dl=isset($dl)?$dl:2;
  62. case "leshort" : $dl=isset($dl)?$dl:2;
  63. case "beshort" : $dl=isset($dl)?$dl:2;
  64. /*
  65. * hexadecimal : 0[xX][0-9a-fA-F]+
  66. * octal  : 0[0-7]+
  67. * decimal  : [1-9][0-9]*|0
  68. */
  69. $to[3] = preg_replace_callback('/^0[xX]([0-9a-fA-F]+)$/','hexadecimal',$to[3]);
  70. $to[3] = preg_replace_callback('/^0([0-7]+)$/','octal',$to[3]);
  71. $to[3] = preg_replace_callback('/^([1-9][0-9]+|0)$/','decimal',$to[3]);
  72. fseek($fp, $x[1]+$dl-strlen($to[3]));
  73. $co = fread($fp, strlen($to[3]) );
  74. if ($co == $to[3]) {
  75.  $znalazl = true; //tu nie pamiętam, trzeba sprawdzić
  76.  echo $to[4];
  77. }
  78.  break;
  79. default:
  80.  echo "Błąd pliku wejściowego";
  81.  }
  82.  unset($dl);
  83.  if ($znalazl){
  84. break;
  85.  }
  86. }
  87. fclose($fp);
  88. ?>

i plik:
magic.mime
można używać innych, ale że skrypt nie obsługuje błędów, to trzeba najczęściej poprawić...

Dostajesz tylko sam mime typ, ale z tych skryptów co były wcześniej da się wyciągnąć z mime na rozszerzenie (albo można bezpośrednio z katalogu apache 'config')

A przypomniało mi się, jest kłopot z plikami exela czy word'a, bo niby mają określoną sygnaturę, ale wiecie jak się Microsoft trzyma standardów (nawet swoich), więc tych plików może (a raczej prawie na pewno) nie rozpoznawać :|
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.