しろあじ備忘録

システム関係の備忘録。ザルのような記憶力なので、こうして書いておかないと忘れるのだよ。

アップロードしたファイルがcsv形式かどうか調べたい(php) その1

csvファイルじゃないならエラーにしたい

 

input type="file" によってブラウザよりアップロードされたファイルがcsv形式ファイルでなければエラーとしたい。

というのが今回の目的。

 POSTによってアップロードしたファイルは、サーバー側で動作するphp側で、

「$_FILES」に入ってくるので、そこから進める。

 

$_FILESについては以下参考 phpのマニュアルね

PHP: POST メソッドによるアップロード - Manual

これを踏まえて考えてみた。

 

そもそも、テキストファイル?

いきなりcsvファイルかどうかの判定は難しそうだ。

なので、テキストファイルかどうかあたりから始めることにした。

$_FILES['userfile']['type'] というのがあるが、

この MIME 型は PHP 側ではチェックされません。そのため、 この値は信用できません。

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ファイルをアップロード

f:id:ramapipi:20171005221339p:plain

↓ アップロード後

 

f:id:ramapipi:20171005221723p:plain

 

赤線が$_FILESの内容

青線がmime_content_type介した結果だ。どちらもjpegと判断している。

 

では、このJPGファイルの拡張子だけを「txt」に変えてアップロードしてみよう。

 

f:id:ramapipi:20171005221939p:plain

↓ アップロード後

f:id:ramapipi:20171005222130p:plain

 

先ほどと同じく

赤線が$_FILESの内容

青線がmime_content_type介した結果だ。

$_FILES['userfile']['type']は、拡張子に騙されてテキストファイルと返してきてるが、mime_content_type は正体を見破って、jpegであると返している。

PHPのマニュアルに書かれていた通り、 

$_FILES['userfile']['type']は信用できない

なのだ。

ということで、mime_content_typeをまずは採用することにした。

 

以下に続く

shiroajisashi.hatenablog.com