アップロードしたファイルがcsv形式かどうか調べたい(php) その1
csvファイルじゃないならエラーにしたい
input type="file" によってブラウザよりアップロードされたファイルがcsv形式ファイルでなければエラーとしたい。
というのが今回の目的。
POSTによってアップロードしたファイルは、サーバー側で動作するphp側で、
「$_FILES」に入ってくるので、そこから進める。
$_FILESについては以下参考 phpのマニュアルね
PHP: POST メソッドによるアップロード - Manual
これを踏まえて考えてみた。
そもそも、テキストファイル?
いきなりcsvファイルかどうかの判定は難しそうだ。
なので、テキストファイルかどうかあたりから始めることにした。
$_FILES['userfile']['type'] というのがあるが、
とPHPのマニュアルサイトで書かれている以上、信用できない。
ファイルのMIMEタイプを調べるというわけだが、ずばり、以下のサイトが参考になった。
今回、php5.4である。
そして上記サイトに載っていた「mime_content_type」を使うことにした。
動作確認は簡単。PHP側で
var_dump($_FILES);
echo "<BR>" . mime_content_type ($_FILES['datafile']['tmp_name'] );
と入れてみただけだ。
もちろん送り元のフォームは
<form enctype="multipart/form-data" ・・・
とmultipartとすることを忘れずに。
そして jpgファイルをアップロード
↓ アップロード後
赤線が$_FILESの内容
青線がmime_content_type介した結果だ。どちらもjpegと判断している。
では、このJPGファイルの拡張子だけを「txt」に変えてアップロードしてみよう。
↓ アップロード後
先ほどと同じく
赤線が$_FILESの内容
青線がmime_content_type介した結果だ。
$_FILES['userfile']['type']は、拡張子に騙されてテキストファイルと返してきてるが、mime_content_type は正体を見破って、jpegであると返している。
PHPのマニュアルに書かれていた通り、
$_FILES['userfile']['type']は信用できない
なのだ。
ということで、mime_content_typeをまずは採用することにした。
以下に続く