web-dev-qa-db-ja.com

PHPでファイルのMIMEタイプを見つけるにはどうすればよいですか?

わかりましたので、私は多くの異なるファイルタイプを処理しなければならないindex.phpファイルを持っています。 REQUEST_URIに基づいてファイルタイプを推測する方法を教えてください。

http://site/image.jpgをリクエストし、すべてのリクエストが次のようなindex.phpを介してリダイレクトする場合

<?php
   include('/www/site'.$_SERVER['REQUEST_URI']);
?>

どのように正しく動作させるのですか?

要求されたファイルの拡張子に基づいてテストする必要がありますか、またはファイルタイプを取得する方法はありますか?

48
Issac Kelly

画像のみを使用していると確信している場合は、 getimagesize() exif_imagetype() PHP関数。画像のMIMEタイプを返そうとします。

外部の依存関係を気にしない場合は、優れた getID ライブラリをチェックアウトすることもできます。このライブラリは、多くの異なるファイルタイプのMIMEタイプを決定できます。

最後に、 mime_content_type() 関数をチェックアウトできますが、 Fileinfo PECL拡張では非推奨になりました。

49
leek

mime_content_type()は非推奨になっているため、将来的に動作することを期待することはできません。 「fileinfo」PECL拡張機能がありますが、それについて良いことは聞いていません。

* nixサーバーで実行している場合、次のことができます。

$file = escapeshellarg( $filename );
$mime = Shell_exec("file -bi " . $file);
$filename should probably include the absolute path.
22
Eric_WVGG
function get_mime($file) {
  if (function_exists("finfo_file")) {
    $finfo = finfo_open(FILEINFO_MIME_TYPE); // return mime type ala mimetype extension
    $mime = finfo_file($finfo, $file);
    finfo_close($finfo);
    return $mime;
  } else if (function_exists("mime_content_type")) {
    return mime_content_type($file);
  } else if (!stristr(ini_get("disable_functions"), "Shell_exec")) {
    // http://stackoverflow.com/a/134930/1593459
    $file = escapeshellarg($file);
    $mime = Shell_exec("file -bi " . $file);
    return $mime;
  } else {
    return false;
  }
}

私にとっては、これは機能しません-mime_content_typeは廃止され、finfoはインストールされず、Shell_execは許可されていません。

18
Ale

実際、PHPにstandardMIMEスニッフィングメソッドがないことにうんざりしていました。 fileinfoをインストール...非推奨の機能を使用...これらの作業は、イメージに対してのみです!私はそれにうんざりしたので、私はいくつかの研究を行い、 WHATWG Mimesniffing spec を見つけました-これはまだドラフト仕様であると思います。

とにかく、この仕様を使用して、PHPでmimesnifferを実装できました。パフォーマンスは問題ではありません。実際、私の謙虚なマシンでは、PHPがタイムアウトする前に何千ものファイルを開いてスニッフィングすることができました。

MimeReaderクラス です。

require_once("MimeReader.php");

$mime = new MimeReader(<YOUR FILE PATH>);
$mime_type_string = $mime->getType();     // "image/jpeg" etc.
10
Shane

画像のみを使用していて、MIMEタイプ(ヘッダーなど)が必要な場合は、これが最も高速で直接的な答えです。

$file = 'path/to/image.jpg';
$image_mime = image_type_to_mime_type(exif_imagetype($file));

画像ファイルの名前を変更しても、真の画像MIMEタイプが出力されます

8
Andrew

PHP 5.3:

<?php
$info = new finfo(FILEINFO_MIME_TYPE);
echo $info->file('myImage.jpg');
// prints "image/jpeg"

FILEINFO_MIME_TYPEフラグはオプションです。それなしでは、いくつかのファイルに対してより詳細な文字列を取得します。 (明らかに、いくつかの画像タイプはサイズと色深度情報を返します)。 FILEINFO_MIMEフラグを使用すると、MIMEタイプとエンコード(使用可能な場合)が返されます(例:image/png; charset = binaryまたはtext/x-php; charset = us-ascii)。詳細については、 このサイト を参照してください。

1
jhaagsma

mime_content_type()は、上記のコメントが非推奨であると言っているにもかかわらず、進むべき道のようです。そうではありません-または少なくとも、このmime_content_type()の具体化は非推奨ではありません( http://php.net/manual/en/function.mime-content -type.php 。これはFileInfo拡張機能の一部ですが、PHPのドキュメントでは、PHP 5.3.0。

1
David

PHPマニュアルによると、これを行うには finfo-file 関数が最適な方法です。ただし、 FileInfo PECL拡張機能をインストールする必要があります。

拡張子がオプションではない場合、古い mime_content_type 関数を使用できます。

1
Devon

画像のみを扱う場合は、タイプを含む画像に関するあらゆる種類の情報を含む[getimagesize()][1]関数を使用できます。

より一般的なアプローチは、PECLのFileInfo拡張を使用することです。 PHPにあります: http://us.php.net/manual/en/ref.fileinfo.php

一部の人々はその拡張機能について深刻な不満を持っています...そのため、深刻な問題に遭遇したり、何らかの理由で拡張機能をインストールできない場合は、廃止された関数をチェックアウトすることをお勧めします mime_content_type()

0
phatduckk

サーバー上のファイルのmimeはこれで取得できます

<?php
function get_mime($file_path){
  $finfo = new finfo(FILEINFO_MIME_TYPE);
  $type  = $finfo->file(file_path);
}

$mime = get_mime('path/to/file.ext');
0
Joshua

http://php.net/manual/de/function.mime-content-type.php からのユーザー関数を使用して非常に良い結果を得ました2009年10月03:43 ''

function get_mime_type($filename, $mimePath = '../etc') { ...

finfo、exec、または廃止された関数は使用しません

リモートリソースでもうまく動作します!

0
vizzy

Linuxを実行していて、拡張機能がある場合は、ハッシュ配列を作成することにより、/ etc/mime.typesからMIMEタイプを読み取ることができます。それをメモリに保存し、配列キーでMIMEを呼び出すだけです:)

/**
 * Helper function to extract all mime types from the default Linux /etc/mime.types
 */
function get_mime_types() {
    $mime_types = array();
    if (
        file_exists('/etc/mime.types') &&
        ($fh = fopen('/etc/mime.types', 'r')) !== false
    ) {
        while (($line = fgets($fh)) !== false) {
            if (!trim($line) || substr($line, 0, 1) === '#') continue;
            $mime_type = preg_split('/\t+/', rtrim($line));
            if (
                is_array($mime_type) &&
                isset($mime_type[0]) && $mime_type[0] &&
                isset($mime_type[1]) && $mime_type[1]
            ) {
                foreach (explode(' ', $mime_type[1]) as $ext) {
                    $mime_types[$ext] = $mime_type[0];
                }
            }
        }
        fclose($fh);
    }
    return $mime_types;
}
0
techouse

使用していませんが、ファイルのmimetypeを取得するための PECL拡張子 があります。公式のドキュメントは マニュアル にあります。

目的によっては、ファイル拡張子は問題ない場合がありますが、非常に簡単に変更されるため、信じられないほど信頼できません。

0
enobrev