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

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

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

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

Q&A

4回答

1764閲覧

PHPExcelで日本語ファイル名のexcelファイルを読み込めない

rmany_s

総合スコア6

PHP

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

0グッド

0クリップ

投稿2018/04/06 02:57

編集2018/04/06 02:59

PHPExcel-1.8を使用してエクセルファイル取込の処理をします。

php

1$fileName = $_FILES['file']['name']; 2$convfilename = mb_convert_encoding($fileName, 'SJIS-win', 'UTF-8'); 3$readFile = "./" . $convfilename; 4$objPExcel = PHPExcel_IOFactory::createReader('Excel2007')->load($readFile);

日本語ファイル名のファイルを読み込めませんでした。
以下のエラーメッセージが表示されます。
「PHPExcel\Reader\Excel2007.php on line 338」

php

1Excel2007.php 2 if (!file_exists($pFilename)) { 3//338行目 throw new PHPExcel_Reader_Exception("Could not open " . $pFilename . " for reading! File does not exist."); 4 }

解決できなかったら、注意事項として「全角文字をファイル名に入れない」としなければなりません。

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

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

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

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

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

guest

回答4

0

んー。

  1. 日本語名ファイルのファイル名を変数に保持
  2. ファイル名をASCII文字のみに変更
  3. PHPExcelで読み込み
  4. 処理
  5. 保存
  6. 最初に退避させた元の日本語ファイル名にリネーム

で、行けるんだと思うんですけど、

単純にファイル名に使ってはいけない文字が含まれていて、サーバーがWindowsですみたいな問題なだけかもしれないですね。

PHPExcel使ったの遥か昔なんでよく覚えてませんけど。

投稿2018/04/06 03:12

編集2018/04/06 03:13
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

rmany_s

2018/04/06 04:08

読み込めなかったファイル名は「担当者マスタ_テスト_A.xlsx」です。
guest

0

なんだかなあ…。
質問のタイトルのせいもあって、問題点が誤誘導されてる気がする。

php

1$fileName = $_FILES['file']['name']; 2$convfilename = mb_convert_encoding($fileName, 'SJIS-win', 'UTF-8'); 3$readFile = "./" . $convfilename; 4$objPExcel = PHPExcel_IOFactory::createReader('Excel2007')->load($readFile);

このコード、そもそもなんだが、$_FILES['file']['name'] にファイルの実体があると思い込んでいることが、そもそもの問題じゃないですか?

$_FILES['file']['name'] はファイルの実体はありません。

アップロードしたファイルの実体は、$_FILES['file']['tmp_name'] ですよ。

投稿2018/04/06 15:39

退会済みユーザー

退会済みユーザー

総合スコア0

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

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

rmany_s

2018/04/09 08:35

書き込みしたコードで問題なく英数字ファイル名のエクセルファイルを読み込めていたのですが・・・ $fileName = $_FILES['file']['tmp_name']; と変更して echoで$fileNameを確認すると C:\xampp\tmp\php83E3.tmp と表示されました。
guest

0

既に出ていますがmove_uploaded_file()で自分で任意の半角英数でファイル名をつけて、そのファイルを読み込んだらどうでしょう。
元のファイル名を保持しておけば何かしら処理した後に戻すこともできるわけですし。

ただ、現在はPHPExcelが非推奨になっているので、後継であるPhpSpreadsheetを使われた方が後々トラブルが少なくて済むかもしれません。

投稿2018/04/06 03:41

m.ts10806

総合スコア80850

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

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

rmany_s

2018/04/06 04:05

>PhpSpreadsheetを使われた方が後々トラブルが少なくて済むかもしれません。 composerでインストールの下記コードはphpに記述するのでしょうか? $composer require phpoffice/phpspreadsheet (php初心者なので、教えてください。)
rmany_s

2018/04/06 04:10

それは、納品先のPCにも必要なインストールコマンドでしょうか?
m.ts10806

2018/04/06 04:10

そもそもcomposerがインストールされていないと実行できませんので、composerのインストールからしてください。
m.ts10806

2018/04/06 04:11 編集

> それは、納品先のPCにも必要なインストールコマンドでしょうか? あくまでパッケージなので、もしアップデートが必要であればその納品先のPCとやらにcomposerを入れればあとは composer update コマンドを実行すれば良いですけど、特にアップデートが必要でなければ不要です。
rmany_s

2018/04/06 04:19

教えていただきありがとうございます。 >現在はPHPExcelが非推奨になっているので・・・ 1.composerをインストール 2.PhpSpreadsheetをインストール 3.PhpSpreadsheetを使って読み込んでみます。
m.ts10806

2018/04/06 04:24

おおよそ機能は同じで同じような書き方もできるので、 移行のストレスはそこまで大きくないはずです。 (もちろん質問の件が解消するわけではありません)
rmany_s

2018/04/06 04:28

納品先のPCは外部のネットに繋げない為、 インストールコマンド curl -sS https://getcomposer.org/installer | php が出来ないのではと思います。 PHPExcelはインストールしたフォルダを置けばいいので こちらでもう少し検討してみようと思います。
m.ts10806

2018/04/06 04:30

で、あれば、開発環境だけに入れれば良いです。 納品先PCにはパッケージファイルだけもって行ってください。
退会済みユーザー

退会済みユーザー

2018/04/06 04:31

昔のPHPはライブラリをダウンロードしてきて適当な場所に配置しrequireするだけでよかったのに、なんかしらないけどComposerが必須とかいうPHPの良さを全否定した余計な事してくれるものが主流になってしまって涙目の人多数。
rmany_s

2018/04/06 04:34

そうなんですね。やってみます。 つまづいたら、またお世話になります。
m.ts10806

2018/04/06 04:35

luckerさん 最悪は開発環境でupdateしたものをvendorフォルダごと入れ替えるっていう手でいけなくはないですし。
退会済みユーザー

退会済みユーザー

2018/04/06 05:41

>最悪は開発環境でupdateしたものをvendorフォルダごと入れ替えるっていう手でいけなくはないですし。 わかる。本番環境デプロイの時は、やる。
rmany_s

2018/04/09 08:11

返事が遅くなってしまいすみません。 PhpSpreadsheetを試してみました。 >(もちろん質問の件が解消するわけではありません) そうなんですよね。。
m.ts10806

2018/04/09 08:14

Kosuke_Shibuyaさんの回答が直接の解決策です。
rmany_s

2018/04/09 08:37

->load($readFile); $readFileが$_FILES['file']['tmp_name'] ということですか?
rmany_s

2018/04/09 09:15

上のページを見まして // 対象ファイル $fileName = $_FILES['file']['name']; $readFile = "./" . $fileName; // 一時ファイル $filepath = $_FILES['file']['tmp_name']; // 一時ファイルができているか(アップロードされているか)チェック if(is_uploaded_file($filepath)){ // 一時ファイルを保存ファイルにコピーできたか if(move_uploaded_file($filepath, $readFile)){ とした後、 $objPExcel = PHPExcel_IOFactory::createReader('Excel2007')->load($readFile); これで英数字ファイル名のファイルは読み込めたのですが、、、
m.ts10806

2018/04/09 21:42

あとはluckerさんの回答の通りにできませんか? 日本語ファイル名は$fileNameに保持しているので、PHPExcelで処理した後に名前を変更すればOKのはずです。 もちろん、ファイル名をUTF8にコンバートしてもいけるとは思いますが(手持ち環境ではいけました)
guest

0

前提として半角英数のファイル名は同じルーチンで問題ないということでしょうか?
また$readFileのキャラクターコードを変更しているように見えますが、
file_existsでファイルの存在は確認できますか?
(勝手にコンバートしたからファイルがないと判断されているのかも)

httpベースで他バイトのファイル名で運用するのは普通はやりませんので
アップされたファイル名とは別のファイル名でアップロードして
呼び出しの際に元のファイル名であるかのような置き換えをすればよいと思います

投稿2018/04/06 03:12

yambejp

総合スコア114829

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

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

rmany_s

2018/04/09 08:13

返事が遅くなりすみません。 半角英数のファイル名は同じルーチンで問題なく動きました。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

まだベストアンサーが選ばれていません

会員登録して回答してみよう

アカウントをお持ちの方は

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問