質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
85.49%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

Q&A

解決済

2回答

7203閲覧

XLSファイル(によっては)のアップロードが出来ない

ssmxgo

総合スコア178

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

CodeIgniter

CodeIgniterは、PHP向けオープンソースのWebアプリケーションフレームワークです。CodeIgniterは覚える構文が少なく、自由度も高いため、PHPを理解していれば構築が簡単です。

0グッド

0クリップ

投稿2015/12/21 07:25

編集2015/12/21 08:28

PHP 5.5.30
Codeigniter2.2.1
サーバーAWS

<追記>
先に記述スべきだったのですが、$_FILESをダンプした所

php

1array(1) { 2 ["userfile"]=> 3 array(5) { 4 ["name"]=> 5 string(16) "filename.xls" 6 ["type"]=> 7 string(24) "application/vnd.ms-excel" 8 ["tmp_name"]=> 9 string(14) "/tmp/phpVvCVSo" 10 ["error"]=> 11 int(0) 12 ["size"]=> 13 int(1910784) 14 } 15}

でしたが、こちらを確認したところ、$_FILESのMIMEは信じてはならないとのことで、
Linuxコマンドから確認したところ、

php

1<?php 2$path = $_FILES['myfile']['tmp_name']; 3$mime = shell_exec('file -bi '.escapeshellcmd($path)); 4$mime = trim($mime); 5$mime = preg_replace("/ [^ ]*/", "", $mime); 6print($mime); 7?>

なんと、
application/CDFV2-encrypted; charset=binary

なるものが返ってきました。もしや?
と思い、LibreOfficeやNumberでxlsファイルを出力すると
それぞれ返されるMimeTypeは異なりましたが、いずれもExcel絡みのTypeで正しくアップロード出来ました。

ところが、今回振り回されたxlsファイルは PHPExcel というLibraryにより出力されたファイルで何かが違うようです。

現段階では、CDFV2-encrypted; これをアップするにはどうすればよいか、という問題に集約されている状況です。


<本文>
公式マニュアルに基づき、ファイルアップローダー?を作りました。
http://codeigniter.jp/user_guide_ja/libraries/file_uploading.html

php:

1<?php 2 3class Upload extends CI_Controller { 4 5 function __construct() 6 { 7 parent::__construct(); 8 $this->load->helper(array('form', 'url')); 9 } 10 11 function index() 12 { 13 $this->load->view('upload_form', array('error' => ' ' )); 14 } 15 16 function do_upload() 17 { 18 $config['upload_path'] = './uploads/'; 19 $config['allowed_types'] = 'xls|xlsx|csv'; 20 $config['max_size'] = '5000000'; 21 $config['overwrite'] = true; 22 23 $this->load->library('upload', $config); 24 25 if ( ! $this->upload->do_upload()) 26 { 27 $error = array('error' => $this->upload->display_errors()); 28 29 $this->load->view('upload_form', $error); 30 } 31 else 32 { 33 $data = array('upload_data' => $this->upload->data()); 34 35 $this->load->view('upload_success', $data); 36 } 37 } 38} 39?> 40

こちらでほぼ正常に挙動するのですが、ふと
xls形式(Excel2003形式)を上げた所、

The filetype you are attempting to upload is not allowed.

のエラー。他のファイル(xlsxやcsv、設定を変えればjpg,pngなど)は正常にアップロードができます。
ネットで調べてみるとmime絡みであることが推測され、

config/mimes.php の設定で xls を

'xls' => array( 'application/excel', 'application/vnd.ms-excel', 'application/msexcel' ),

から

'xls' => array( 'application/excel', 'application/vnd.ms-excel', 'application/octet-stream' ),
とか
'xls' => array( 'application/vnd.openxmlformats-officedocument.spreadsheetml.sheet', 'application/zip', 'application/x-zip', 'application/vnd.ms-excel', 'application/msexcel', 'application/excel', 'application/vnd.ms-office' ),

に変更してみましたが、状況変わらずです。

なにぶん、英語に弱いためネットの資料を存分に活用しきれず挫折しそうです。
毎回お助けお願いしますで大変お恥ずかしいばかりですが、どうかお力添えお願い致します。

気になる質問をクリップする

クリップした質問は、後からいつでもMYページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

guest

回答2

0

どうも元のEXCELファイルの問題が絡んでいたようです

このようなお見立てのようですが、ことなる見解を…
mimetype というのは実は apache の機能で判定されています。

httpd.conf に AddType という部分があるのですが、ここで設定するとちゃんと判定されます。
管理者でない場合、.htaccess でも設定可能です。

投稿2015/12/21 08:43

編集2015/12/21 08:47
退会済みユーザー

退会済みユーザー

総合スコア0

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssmxgo

2015/12/21 08:47

すみません、メッセージ見落としてしまっていたようです。 サーバーに関してはほぼ無知なので…そちらからの対応というのは、なるほど勉強になりました!
退会済みユーザー

退会済みユーザー

2015/12/21 08:52

httpd.conf に AddType application/vnd.ms-excel .xls を追記すればOKです。
ssmxgo

2015/12/24 05:09

ありがとうございます!
guest

0

ベストアンサー

ちょっと興味があったので調べてみたところ
参考URL

Office2003以前のファイルについては、ExcelやPowerPointもすべて「application/msword」と判定されるので、以下の表に従ってバイト列を比較して判断しましょう。

という事なので、application/mswordを追加してみるとどうなるでしょうか。

投稿2015/12/21 07:58

tanat

総合スコア18711

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

ssmxgo

2015/12/21 08:13

おおおおおおお、なんとタイムリーな!!! ありがとうございます、ちょうど同じページを見ていました。 ご提示の方法、試してみます。 先に、他の回答者にご負担にならないようにわかったことがありましたので書き込ませていただきますのでお待ち下さいませ。
ssmxgo

2015/12/21 08:17

ごめんなさい、試すのが容易いことでしたのでやってみましたがNGでした。 どうも元のEXCELファイルの問題が絡んでいたようですm(_ _)m 質問に追記いたします。
ssmxgo

2015/12/21 08:42

大変申し訳ありません。 問題解決しました。アップロードするxlsファイルの問題だったようですが、PHPExcelで出力したもののうち、ある一定期間のファイルに対し、`application/CDFV2-encrypted;`となってしまっていてアップロード出来ませんでした。 しかし、再度PHPExcelで出力するとCDFV2のファイルは出力されなくなり、取り敢えず問題解決となりました。 Tanatさん、その他のみなさま、大変お手数おかけしました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
85.49%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問