49

さて、私はさまざまな種類のファイルを処理する必要がある index.php ファイルを持っています。に基づいてファイルタイプを推測するにはどうすればよいですかREQUEST_URI

をリクエストhttp://site/image.jpgすると、すべてのリクエストが index.php を介してリダイレクトされます。これは次のようになります。

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

それを正しく機能させるにはどうすればよいですか?

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

4

13 に答える 13

51

画像のみを使用していることが確実な場合は、getimagesize() exif_imagetype() PHP関数。画像のmime-typeを返そうとします。

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

最後に、 mime_content_type()関数をチェックアウトできますが、 FileinfoPECL拡張機能では非推奨になっています。

于 2008-09-25T17:59:56.347 に答える
22

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

* nixサーバーで実行している場合は、次の操作を実行できます。これは私にとっては問題なく機能しました。

$file = escapeshellarg( $filename );
$mime = shell_exec("file -bi " . $file);
$filename should probably include the absolute path.
于 2008-09-25T18:05:14.990 に答える
18
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ていません。

于 2012-08-30T07:29:28.913 に答える
10

私は、PHP に標準のMIME スニッフィング メソッドがないことに実際にうんざりしていました。fileinfo をインストール... 非推奨の関数を使用... ああ、これらは機能しますが、画像のみです! 私はそれにうんざりしたので、いくつかの調査を行い、WHATWG Mimesniffing 仕様を見つけました- これはまだドラフト仕様だと思います.

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

これがMimeReader クラスです。

require_once("MimeReader.php");

$mime = new MimeReader(<YOUR FILE PATH>);
$mime_type_string = $mime->getType();     // "image/jpeg" etc.
于 2013-08-01T02:39:20.073 に答える
8

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

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

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

于 2013-03-06T19:34:56.990 に答える
1

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

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

于 2008-09-25T18:01:38.573 に答える
1

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

于 2016-01-31T05:20:22.370 に答える
0

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

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

于 2008-09-25T18:00:47.107 に答える
0

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

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

一部の人々はその拡張機能について深刻な不満を持っています...したがって、深刻な問題が発生した場合、または何らかの理由で拡張機能をインストールできない場合は、非推奨の機能を確認することをお勧めしますmime_content_type()

于 2008-09-25T18:03:18.350 に答える
0

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;
}
于 2016-08-24T18:58:38.053 に答える
0

http://php.net/manual/de/function.mime-content-type.php @''john dot howard at prismmg dot com 26-Oct-2009 03:43' のユーザー関数を使用して非常に良い結果が得 られました'

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

finfo、exec、または非推奨の機能を使用しない

リモートリソースでもうまく機能します!

于 2012-09-12T11:46:16.910 に答える