- 締切済み
CSVのMIMEタイプ
PHPを使用してCSVの入力チェックを行おうとしています。 エクセルファイルの内容をcsv形式で保存していますが、EXCEL2003で保存したcsvはtext/plainとしてMIMEタイプが認識されますが、EXCEL2007で保存するとMIMEタイプがapplication/octet-streamとして認識されてしまいます。 1.エクセルファイルをエクスプローラー等から名前の変更で拡張子ごと無理矢理csvに変更することが想定されています。 その場合は当然入力チェックではじきたいのですがMIMEタイプでtext/plain text/csv以外はじくということが出来なくて困っています。 何かPHP側でCSVかどうかを確認する方法はありますでしょうか? (エクセルファイル以外にもテキスト形式ではない場合はエラーとしたいです。) 1行取り出して、指定カラム分あるかのチェックは別にしていますが、上述の通り、EXCELを無理に直したのか、純粋に中のデータの列定義がおかしいのかは分けてエラーを表示したいと考えています。 2.1が難しいという場合エクセル側でMIMETYPEを変更することはできないでしょうか? 現在は名前を付けて保存で、拡張子をcsvを選択して保存しています。 (2007以降でバージョンは様々あります。)
- みんなの回答 (3)
- 専門家の回答
みんなの回答
- shimix
- ベストアンサー率54% (865/1590)
>何故同じブラウザで且つ同じ処理を通してmimeタイプ変わって >しまうのかちょっと謎ですね。 ブラウザ依存ですがファイルの中身をチェックしている可能性はあります(拡張子とファイルの中身が違う=拡張子だけ強制的に.csvに変えた場合など)。 当然ですが「CSVで保存」した場合には、まったく同一のデータが生成されるハズです。エディタで開いて同じ内容であれば、それ以上の情報はどこにもありませんので。 >1行という表現が語弊があり済みません。 >EXCELで言う一行分のコードを取り出しています。 ですから「EXECLで言う一行」を取り出すのは(CSVファイルが対象であれば)fgetcsvしか使えませんが、それは大丈夫ですよね?という確認です。 EXCELの一行のデータに(というかひとつのカラムに)改行を含められるのは理解されていますよね(セルへの入力途中でAlt+Enter)。CSV出力した場合には二重引用符で括られた文字列データ内に改行コードが含まれます。
- shimix
- ベストアンサー率54% (865/1590)
補足です。 >1行取り出して、指定カラム分あるかのチェックは別にしていますが このときfgetcsvで読込んでいますよね?Excelから作成したCSVならデータ中に改行コードも含まる(可能性がある)のでfgetcsvで読まないといけません。
お礼
有難うございます。 1行という表現が語弊があり済みません。 EXCELで言う一行分のコードを取り出しています。 その部分は問題ありませんのでご安心ください。
- shimix
- ベストアンサー率54% (865/1590)
CSVファイル・・・ですよね。テキスト以外には何も情報はありませんので、mimeタイプも(ファイル自体は)持っていません。拡張子が.csvであればmimeタイプは送信側(アップロードならブラウザが、ダウンロードならwebサーバもしくは出力するするクリプトが)で付与するだけです。アテに出来るものでもありません。 テキストの形式がRFC4180に則っていればいいだけではないのですかね? http://www.kasai.fm/wiki/rfc4180jp
お礼
早速の回答ありがとうございます。 ファイル自体は持っていないんですね。 なら、何故同じブラウザで且つ同じ処理を通してmimeタイプ変わってしまうのかちょっと謎ですね。 もし、エクセルファイルを無理矢理拡張子変更して読みこんじゃうとRFC4180に則っているか確認するとすると、下手するとすごく沢山プログラム上で展開する可能性ってないんですかね?(改行とかってエクセルファイルはないのでしょうか?) 全体で200列ほど3000行は少なくともあるファイルなので全部メモリ上に展開されてしまうとちょっとパフォーマンス的に面倒かな?という不安もあります。(最大で○○文字以上は取り込まないみたいな制限をかけるというのが現実的なのかもしれませんね。)
お礼
普通の処理の部分はfgetcsvで問題なくコードをかけていますのでご安心ください。(理解していますし、正しいファイルの読み込み部分は完成しております。) 今回質問しましたのは、その前の段階として明らかにおかしなファイルをはじくという部分についてですので関係ないと思っていおります。 チェックとしては通常処理の前に fgetcsvのlengthをパフォーマンスに影響しない程度で、且つ運用上考えられる2項目以上になるだろう長さにして2項目以上あるかのチェックをするあたりが落としどころかなと考えました。 (ファイル名のcsv拡張子チェックはすでにしているのでそれ以上だとそのくらいなのかなと考えました。) 有難うございました。