Co się stało z php mime_content_type?

Niespodziewanie dostawca hostingu moich stron internetowych postanowił zaktualizować wersję PHP5, jakieś jej rozszerzenia lub namieszał jeszcze w czymś innym (np. plik php.ini zawiera konfigurację „–without-mime-magic”, może to się teraz zmieniło?).

Pierwszym dostrzeżonym skutkiem jest błąd powstający przy próbie wywołania funkcji mime_content_type, która dotychczas dla wskazanego pliku odczytywała rodzaj MIME/Content-type niezależnie od jego rozszerzenia (np. za plikiem o końcówce .png wcale nie musi się kryć plik PNG). Niestety teraz funkcja całkowicie zniknęła, powodując błąd krytyczny:

Fatal error: Call to undefined function mime_content_type()

Teraz wiem, że już wcześniej była oznaczona jako przestarzała. Czym więc ją zastąpić?
Gdybym miał zainstalowane rozszerzenie PECL,  mógłbym użyć zalecaną zewsząd konstrukcję finfo. W podręczniku podlinkowanym obok można odnaleźć dwa sposoby odczytania typu MIME: obiektowy i formalny. Pierwszy jest szybszy, jeśli nie odczytujemy żadnych innych właściwości pliku.

Proponuję odczytać MIME do zmiennej $m w następujący sposób:

if (defined(FILEINFO_MIME_TYPE)&&($t=new finfo(FILEINFO_MIME_TYPE))) $m=$t->file($url);
else $m=@mime_content_type($url);

Co zrobić jednak, gdy hostingodawca nie zainstalował nam PECL, tak jak u mnie? Można go grzecznie poprosić, aby poinstalował, co trzeba. Właściwie poza tym to nic nie można zrobić. Co najwyżej można samemu przygotować bazę danych zawierającą najczęstsze rozszerzenia nazw plików oraz zazwyczaj odpowiadające im typy MIME. Ale to nie jest sprawdzanie prawdziwego MIME zawartości plików, tylko formalnych nazw plików.

Niestety, właśnie w takiej sytuacji jestem ja. Na razie czekam na odpowiedź serwisu technicznego Superhost. Tymczasem pozostają niedostępne wszystkie multimedia z serwisu genealogia.mrog.org.

Przy okazji, aby wskazać konkretną wersję PHP, która ma wykonać skrypt w danej ścieżce, w szczególności gdy serwer domyślnie wykonuje inną wersję, w pliku .htaccess wystarczy dodać linijkę:
AddHandler application/x-httpd-php5 .php
gdzie „.php” to rozszerzenie pliku, w którym zapisano skrypt (zazwyczaj „.php5” jest już automatycznie obsługiwane przez php5, więc tego nie trzeba dopisywać). Taka zmiana obowiązuje w całym katalogu, w którym jest plik .htaccess, jak i we wszystkich jego podkatalogach, chyba że plik .htaccess w danym podkatalogu ma inne ustawienia.

PS z 30.08.2010. Przedwczoraj otrzymałem odpowiedź. Teoretycznie nic się nie zmieniło, choć rzeczywiście, wersja php5 nie ma „mime-magic”. Rozważą możliwość doinstalowania finfo w przyszłości. A na razie doradzili obejście problemu przez sprawdzanie rozszerzenia nazwy pliku. Cóż. Tyle to już sam się wywiedziałem. Nie mam innego wyboru jak właśnie tak robić — głupie to, ale cóż począć.


function r19mime($x) {
     if (defined(FILEINFO_MIME_TYPE)&&($t=new finfo(FILEINFO_MIME_TYPE))) $m=$t->file($url);
     else if (function_exists('mime_content_type')) $m=mime_content_type($url);
     if (!$m) {
          $mime_types=array(
          'txt' => 'text/plain',
          'htm' => 'text/html',
          'html' => 'text/html',
          'php' => 'text/html',
          'css' => 'text/css',
          'js' => 'application/javascript',
          'json' => 'application/json',
          'xml' => 'application/xml',
          'swf' => 'application/x-shockwave-flash',
          'flv' => 'video/x-flv',
          // images
          'png' => 'image/png',
          'jpe' => 'image/jpeg',
          'jpeg' => 'image/jpeg',
          'jpg' => 'image/jpeg',
          'gif' => 'image/gif',
          'bmp' => 'image/bmp',
          'ico' => 'image/vnd.microsoft.icon',
          'tiff' => 'image/tiff',
          'tif' => 'image/tiff',
          'svg' => 'image/svg+xml',
          'svgz' => 'image/svg+xml',
          // archives
          'zip' => 'application/zip',
          'rar' => 'application/x-rar-compressed',
          'exe' => 'application/x-msdownload',
          'msi' => 'application/x-msdownload',
          'cab' => 'application/vnd.ms-cab-compressed',
          // audio/video
          'mp3' => 'audio/mpeg',
          'qt' => 'video/quicktime',
          'mov' => 'video/quicktime',
          // adobe
          'pdf' => 'application/pdf',
          'psd' => 'image/vnd.adobe.photoshop',
          'ai' => 'application/postscript',
          'eps' => 'application/postscript',
          'ps' => 'application/postscript',
          // ms office
          'doc' => 'application/msword',
          'rtf' => 'application/rtf',
          'xls' => 'application/vnd.ms-excel',
          'ppt' => 'application/vnd.ms-powerpoint',
          // open office
          'odt' => 'application/vnd.oasis.opendocument.text',
          'ods' => 'application/vnd.oasis.opendocument.spreadsheet',
          );
          $ext=strtolower(array_pop(explode('.',$url)));
          if (array_key_exists($ext,$mime_types)) $m=$mime_types[$ext];
          else $m='application/octet-stream';
     } return $m;
}

Dodaj komentarz

Twój adres e-mail nie zostanie opublikowany. Wymagane pola są oznaczone *