#導入
先日、とあるWebアプリケーションのCSVファイルアップロード機能を追加開発した時にMacではうまくいっていたファイルの中身のバリデートチェックがWindowsでは全然機能しなかった問題が発生したので備忘録として。
#アプリケーション環境
- Ubuntu(バージョンは忘れた)
- PHP-7.2fpm
- CakePHP 2系
- nginx
#動作確認環境
###不具合が発生した環境
- WindowsのChrome、InternetExplorer11、FireFox
###問題がなかった環境
- MacのChrome、FireFox
#原因調査内容
###MacとWindowでは同じChromeでも仕様がちがう?
→検索していろいろ調べてみたが原因解明できず、一旦保留
###MacとWindowsではブラウザの初期のセキュリティ設定が違う??
→JavaScriptやCookieの設定等いろいろいじってみたが挙動変わらず。
###nginxかPHPの設定がおかしい???
→nginxはそもそも関係なかった。。。
→PHPはphp.confにuploadファイルの設定があったので、一時保存先や最大ファイルサイズ等変更するが変わらず(そもそもサーバの設定ならWindowsとMacで挙動変わらないはず。)
###ctpファイル(View)の実装がおかしい????
→こちらもformタグに「multipart/form-data」が設定されているから問題ない気がする?
###MacとWindowsでrequestの中身が違うんじゃ?????
→とりあえず、アップロードファイルが格納される変数をCotrollerで画面に出力するコードを記載
MacとWindowsのそれぞれで出力結果を確認してみる。
// ファイルの中身を出力
echo "<pre>";
var_dump($_FILE);
echo "</pre>";
exit();
出力結果が以下、、、ん??
#Windows
array(1) {
["data"]=>
array(5) {
["name"]=>
array(1) {
["XXXXXXXX"]=>
array(1) {
["upfile"]=>
string(12) "TEST.csv"
}
}
["type"]=>
array(1) {
["XXXXXXXX"]=>
array(1) {
["upfile"]=>
string(24) "application/vnd.ms-excel"
}
}
["tmp_name"]=>
array(1) {
["XXXXXXXX"]=>
array(1) {
["upfile"]=>
string(14) "/tmp/phpQYwrAs"
}
}
["error"]=>
array(1) {
["XXXXXXXX"]=>
array(1) {
["upfile"]=>
int(0)
}
}
["size"]=>
array(1) {
["XXXXXXXX"]=>
array(1) {
["upfile"]=>
int(56)
}
}
}
}
#Mac
array(1) {
["data"]=>
array(5) {
["name"]=>
array(1) {
["XXXXXXXX"]=>
array(1) {
["upfile"]=>
string(12) "TEST.csv"
}
}
["type"]=>
array(1) {
["XXXXXXXX"]=>
array(1) {
["upfile"]=>
string(8) "text/csv"
}
}
["tmp_name"]=>
array(1) {
["XXXXXXXX"]=>
array(1) {
["upfile"]=>
string(14) "/tmp/phpICM53a"
}
}
["error"]=>
array(1) {
["XXXXXXXX"]=>
array(1) {
["upfile"]=>
int(0)
}
}
["size"]=>
array(1) {
["XXXXXXXX"]=>
array(1) {
["upfile"]=>
int(18)
}
}
}
}
MIMEtypeが違うな?
#結論
ファイルの型のチェックの際、MIMEtypeのチェックをしていたが、
"text/csv"のみ許容する実装になっていたため、Windowsから送信されるMIMEtypeが"application/vnd.ms-excel"になっていたのでCSVファイルと判定されていませんでしたね。。。
現在はファイル名の後ろが「.csv」かどうかで判定するように変更して落ち着きました。