LoginSignup
9
4

More than 5 years have passed since last update.

WindowsでCSVファイルアップロードうまくいかない。。。

Posted at

導入

先日、とある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」かどうかで判定するように変更して落ち着きました。

9
4
1

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
9
4