PHP でファイルの MIME タイプを確認するにはどうすればよいですか?
-
02-07-2019 - |
質問
さて、多くの異なるファイルタイプを処理する必要があるindex.phpファイルがあります。に基づいてファイルタイプを推測するにはどうすればよいですか REQUEST_URI
.
私がリクエストしたら http://site/image.jpg
, そしてすべてのリクエストはindex.phpを通じてリダイレクトされます。これは次のようになります。
<?php
include('/www/site'.$_SERVER['REQUEST_URI']);
?>
それを正しく機能させるにはどうすればよいでしょうか?
要求されたファイルの拡張子に基づいてテストする必要がありますか、それともファイルタイプを取得する方法はありますか?
解決
画像だけを使って作業していると確信している場合は、以下をチェックしてください。 getimagesize() exif_imagetype() 画像の MIME タイプを返そうとする PHP 関数。
外部依存関係を気にしない場合は、優れた ID3を取得 さまざまなファイル タイプの MIME タイプを決定できるライブラリ。
最後に、以下をチェックしてください。 mime_content_type() 関数 - ただし、この関数は非推奨になりました。 ファイル情報 PECL拡張子。
他のヒント
mime_content_type() は非推奨であるため、将来的には機能することを期待できなくなります。「fileinfo」PECL 拡張子がありますが、それについて良いことは聞いていません。
*nix サーバー上で実行している場合は、次のようにすることができます。これは私にとってはうまくいきました。
$file = escapeshellarg( $filename );
$mime = shell_exec("file -bi " . $file);
$filename should probably include the absolute path.
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
は許可されていません。
実際、不足してうんざりしていました 標準 PHP の MIME スニッフィング方法。ファイル情報をインストールします...非推奨の関数を使用する...ああ、これらは機能しますが、画像のみです。うんざりしたので調べてみたら、 WHATWG マイムスニッフィング仕様 - ただし、これはまだドラフト仕様だと思います。
とにかく、この仕様を使用して、PHP で mimesniffer を実装することができました。パフォーマンスは問題ありません。実際、私の簡易マシンでは、PHP がタイムアウトになる前に何千ものファイルを開いて盗聴することができました。
ここにあります MimeReader クラス.
require_once("MimeReader.php");
$mime = new MimeReader(<YOUR FILE PATH>);
$mime_type_string = $mime->getType(); // "image/jpeg" etc.
画像のみを操作していて、MIME タイプが必要な場合 (例:ヘッダーの場合)、これが最も速くて直接的な答えです。
$file = 'path/to/image.jpg';
$image_mime = image_type_to_mime_type(exif_imagetype($file));
画像ファイルの名前を変更した場合でも、真の画像 MIME タイプが出力されます。
phpマニュアルによると、 finfo ファイル 関数はこれを行うための最良の方法です。ただし、以下をインストールする必要があります。 ファイル情報 PECL拡張子。
拡張子がオプションでない場合は、古い拡張子を使用できます。 mime_content_type 関数。
mime_content_type()
上記のコメントでは非推奨であると述べられていますが、それが推奨される方法であるようです。それはそうではありません -- 少なくともこの化身は mime_content_type()
によると、非推奨ではありません http://php.net/manual/en/function.mime-content-type.php. 。これは FileInfo 拡張子の一部ですが、PHP ドキュメントによると、PHP 5.3.0 ではデフォルトで有効になっています。
PHP 5.3 以降では、finfo を使用してこれを実現できます。
<?php
$info = new finfo(FILEINFO_MIME_TYPE);
echo $info->file('myImage.jpg');
// prints "image/jpeg"
FILEINFO_MIME_TYPE フラグはオプションです。これがないと、ファイルによってはより冗長な文字列が得られます。(どうやら、一部の画像タイプはサイズと色深度の情報を返すようです)。FILEINFO_MIME フラグを使用すると、MIME タイプとエンコーディングが返されます(利用可能な場合)。画像/png;charset=binary または text/x-php;charset=us-ascii)。見る このサイト 詳細については。
のユーザー関数を使用して非常に良い結果が得られましたhttp://php.net/manual/de/function.mime-content-type.php@''ジョン ドット ハワード、プリズム ドット コム 2009 年 10 月 26 日 03:43''
function get_mime_type($filename, $mimePath = '../etc') { ...
finfo、exec、または非推奨の関数を使用しない
リモートリソースでもうまく機能します。
画像のみを扱う場合は、 [getimagesize()][1]
タイプを含む画像に関するあらゆる種類の情報を含む関数。
より一般的なアプローチは、PECL の FileInfo 拡張子を使用することです。この拡張機能の PHP ドキュメントは次の場所にあります。 http://us.php.net/manual/en/ref.fileinfo.php
この拡張機能について深刻な不満を抱いている人もいます...したがって、重大な問題が発生した場合、または何らかの理由で拡張機能をインストールできない場合は、非推奨の関数を確認してください。 mime_content_type()
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;
}
サーバー上の任意のファイルの 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');