現在、ファイルのアップロードについて網羅的に調べています。
私が調べた限り、アップロードしたファイルのMIMEタイプを確認できる関数まはたクラスは5つありました。
それぞれ、バージョンまたは拡張の有無によって使えるか変わるので、2つのXAMPP環境で動作を確認しました。
それぞれの結果が下記です。
関数 | XAMPP 1.6.1(PHP 5.2.1) | XAMPP 1.7.3(PHP 5.3.1) |
---|---|---|
mime_content_type | × | ○ |
finfo クラス | × | ○ |
fileinfo 関数 | × | ○ |
getimagesize | ○ | ○ |
exif_imagetype | ○ | ○ |
ファイルをサーバーに保存したくないので move_uploaded_file は、なるべく使いたくないと仮定します。
(ユーザーが直接アクセスできないディレクトリに保存すればよいだけですが、今回はなるべく使わない方法を聞きたいです)
2つ質問がございます。
【質問1】テンポラリファイルのMIMEタイプは、どの関数またはクラスで確認できますか?
私の確認の仕方に問題があるかもしれませんが、下記のようにfileinfo関数では、テンポラリファイルのMIMEタイプを確認できました。
<!DOCTYPE html> <html lang="ja"> <head> <meta charset="UTF-8"> <title>PHP</title> </head> <body> <form method="post" enctype="multipart/form-data"> <p>Pictures: <input type="file" name="pictures"> <input type="submit" value="送信"> </p> </form> <?php if(isset($_FILES['pictures'])) { $tmp_file_data = file_get_contents($_FILES['pictures']['tmp_name']); $finfo = finfo_open(FILEINFO_MIME); $mime_type = finfo_buffer($finfo, $tmp_file_data); finfo_close($finfo); echo '<p>fileinfo 関数の値:' . $mime_type . '</p>'; } ?> </body> </html>
試してはないですが、finfoクラスでも同様に確認できるかと思います。
他の関数については、$_FILES['pictures']['tmp_name']
を指定してもエラーが表示されます。
これらは、move_uploaded_file
でファイルを移動すれば、問題なく確認できましたが、テンポラリファイルの状態では確認できませんでした。
テンポラリファイルのMIMEタイプを確認できるのは、fileinfo関数またはfinfoクラスだけですか?
【質問2】PHP5.2環境ではテンポラリファイルのMIMEタイプをどのように確認していたのでしょうか?
私が5.2環境で試したときは、getimagesize と exif_imagetype しか動作しませんでした。
私の検証結果が正しければ、これらの関数ではテンポラリファイルのMIMEタイプは確認できないです。
PHP5.2を使っていた時代でもファイルのアップロードはしていたと思います。
どのようにMIMEタイプを確認していたのでしょうか?
考えられる方法(※調べた結果なので試してません)
Fileinfo
は、PHP5.3まではPECL拡張なので、追加して確認する- fileコマンドで確認する
file_get_contents
+bin2hex
でバイナリデータを取得して、自前で用意したマジックバイトシーケンスと一致するか確認する- テンポラリファイルの状態で確認するのは諦め、
move_upload_file
+getimagesize
orexif_imagetype
で確認する
ご存じの方いれば、教えてください((_ _ (´ω` )ペコ
回答2件
あなたの回答
tips
プレビュー