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

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

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

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

Q&A

解決済

3回答

8994閲覧

日本語名のエクセルファイルのダウンロードができない「laravel」

kodoumai

総合スコア7

PHP

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

Laravel 5

Laravel 5は、PHPフレームワークLaravelの最新バージョンで、2014年11月に発表予定です。ディレクトリ構造がが現行版より大幅に変更されるほか、メソッドインジェクションやFormRequestの利用が可能になります。

0グッド

1クリップ

投稿2018/01/12 11:06

編集2018/01/12 12:15

##不明点
お世話になります。
現在日本語名のエクセルファイルのダウンロード処理を書いているのですが、日本語名では該当のファイルが存在しませんと表示され、ダウンロードできません。
資料も探したのですが、望むものがありませんでした。
どのようにすれば日本語名でもダウンロードできますでしょうか?

ご教授いただければ幸いです。

$filePath = storage_path().'/app/public/history/履歴書.xlsx'; $fileName = '履歴書.xlsx'; // headerで拡張子や出力形式の指定 $headers = [ 'Content-Type' => 'application/vnd.ms-excel', 'Content-Disposition'=>'attachment; filename="'.$fileName.'"' ]; return response()->download($filePath, $fileName, $headers);

##追記
ご回答頂いた内容を踏まえた結果下記のエラーが出力されました。

[Fri Jan 12 21:13:21.593528 2018] [:error] [pid 41704:tid 1948] [client ::1:55594] PHP Fatal error: Class App\Providers\ResponseMacroServiceProvider contains 1 abstract method and must therefore be declared abstract or implement the remaining methods (Illuminate\Support\ServiceProvider::register) in X:\asp\home\laravel\app\Providers\ResponseMacroServiceProvider.php on line 27, referer: http://portal.localhost/ [Fri Jan 12 21:13:21.610530 2018] [:error] [pid 41704:tid 1948] [client ::1:55594] PHP Fatal error: Uncaught Error: Call to a member function connection() on null in X:\asp\home\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php:3224\nStack trace:\n#0 X:\asp\home\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(3190): Illuminate\Database\Eloquent\Model::resolveConnection(NULL)\n#1 X:\asp\home\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(1870): Illuminate\Database\Eloquent\Model->getConnection()\n#2 X:\asp\home\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(1813): Illuminate\Database\Eloquent\Model->newBaseQueryBuilder()\n#3 X:\asp\home\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php(1432): Illuminate\Database\Eloquent\Model->newQueryWithoutScopes()\n#4 X:\asp\home\laravel\app\Exceptions\Handler.php(44): Illuminate\Database\Eloquent\Model->save()\n#5 X:\asp\home\laravel\vendor\laravel\framework\src\Illuminate\Foundation\Bootstrap\HandleExceptions.php(79): App\Exceptions\Handler in X:\asp\home\laravel\vendor\laravel\framework\src\Illuminate\Database\Eloquent\Model.php on line 3224, referer:

よろしくお願いいたします。

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

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

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

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

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

Tomak

2018/01/13 00:00

Laravelのバージョンと開発環境を教えてほしいです。私の環境(Ubuntu+Laravel-5.4+PHP-5.6)ではプロバイダなどの設定なしに「return response()->download($filePath);」で日本語ファイルもダウンロードできました。あとエラー箇所は「app\Providers\ResponseMacroServiceProvider.php on line 27」と、モデルでの接続コネクションがNULLのため、DBコネクションエラーが出ています。
kodoumai

2018/01/13 00:19

ご回答ありがとうございます。laravelのバージョンは5.1です。
guest

回答3

0

ベストアンサー

コメントでWindows版PHP環境だと教えていただいたので、解決済みですが回答を編集しておきます。
Windows版PHP環境の場合、ファイル名取得の際、日本語ファイル名はCP932(SJIS-WIN)なので日本語ファイル名の文字コード変換すれば動くと思います。現在試せないので動かなかったらすみません。

  1. 日本語ファイル名文字コード:CP932(SJIS-WIN)
  2. PHP文字コード:UTF-8

Laravel,Symfony関連ソース

  1. Illuminate\Routing\ResponseFactory::download()
  2. Symfony\Component\HttpFoundation\BinaryFileResponse::setFile()
  3. Symfony\Component\HttpFoundation\File\File(\SplFileInfo拡張 ←ここでファイルパス設定)
  4. Symfony\Component\HttpFoundation\BinaryFileResponse::setContentDisposition()

ResponseMacroServiceProvider.php

他の回答者の方の回答にあったResponseMacroServiceProvider.phpを使う場合ちょっと編集が必要になります。変更したくない場合は最初に\SplFileInfoインスタンスを作成して第1引数に渡します。(この際は第2引数を絶対に渡さなければいけません)
https://qiita.com/zeriyoshi/items/8b031b9c4a5a068fe0e4

php

1 $filePath = storage_path().'/app/public/history/ほげほげ.xls'; 2 $fileName = 'ほげほげ.xls'; 3 4 // headerで拡張子や出力形式の指定 5 $headers = [ 6 'Content-Type' => 'application/vnd.ms-excel', 7 'Content-Disposition'=>'attachment; filename="'.$fileName.'"' 8 ]; 9 10 return response()->download($filePath, $fileName, $headers);

App/Providers/ResponseMacroServiceProvider.php レスポンスファクトリマクロ設置、config/app.php ['providers'] に登録。

php

1namespace App\Providers; 2 3use Illuminate\Support\Str; 4use Illuminate\Support\ServiceProvider; 5use Illuminate\Support\Facades\Response; //ファサード 6use Symfony\Component\HttpFoundation\BinaryFileResponse; 7 8class ResponseMacroServiceProvider extends ServiceProvider 9{ 10 public function boot() 11 { 12 //ファサードでも可 13 Response::macro('download', function($file, $name = null, array $headers = array(), $disposition = 'attachment') 14 { 15 //PHP側はUTF-8だと想定(※違う場合は変更) 16 if (false !== strpos(PHP_OS, 'WIN') && is_string($file)) { 17 if (empty($name)) { 18 $name = basename($file); 19 } 20 $file = new \SplFileInfo(mb_convert_encoding($file, 'SJIS-win', 'UTF-8')); 21 } 22 23 $response = new BinaryFileResponse($file, 200, $headers, true); 24 25 if (empty($name)) { 26 $name = basename($file); 27 } 28 29 return $response->setContentDisposition($disposition, $name, Str::ascii($name)); 30 }); 31 } 32 //... 33}

投稿2018/01/13 02:56

編集2018/01/13 21:00
Tomak

総合スコア1652

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

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

kodoumai

2018/01/13 05:53

ご回答ありがとうございます。 Linux環境ではなぜかうまくいきましたが、windowsのローカル環境ではうまくいきませんでした。 その原因が不明ですが、問題はひとまず解決しました ご協力いただきましてありがとうございます。
guest

0

[Fri Jan 12 21:13:21.593528 2018] [:error] [pid 41704:tid 1948] [client ::1:55594] PHP Fatal error: Class App\Providers\ResponseMacroServiceProvider

上記のクラスはIlluminate\Support\ServiceProvider::registerを継承しているということですね。
継承したクラスは抽象クラスのもつ抽象メソッドを全て実装してなくてはならないというエラーですね。

日本語のエクセルファイルが問題じゃなくて、そもそも文法エラーです。アルファベットのファイル名でも同じエラーになるはずですよ。

リファレンス
クラスの抽象化

投稿2018/01/12 15:39

編集2018/01/12 16:18
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

kodoumai

2018/01/13 00:21

ご回答ありがとうございます。 質問内に記載しましたコードではアルファベットの場合エラーは起こりません。 Illuminate\Support\ServiceProvider内に「register」は存在するのですが、実装とはそのような意味ではないのでしょうか?
guest

0

これとかバッチリなのでは?と思います。Qiitaの記事ですが。

https://qiita.com/zeriyoshi/items/8b031b9c4a5a068fe0e4

何かまたわからないところがあれば、聞いてください。

投稿2018/01/12 11:24

SuguruOhki

総合スコア96

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

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

kodoumai

2018/01/12 11:50

ご回答ありがとうございます。 コードを入れてみたのですが、エラーコード500が返ってきます。 おそらくproviderに問題があると思うのですが・・・
SuguruOhki

2018/01/12 11:52

詳しいエラー文もらえますか?
kodoumai

2018/01/12 12:03

500 Internal Server Errorのみでホワイトページになります
SuguruOhki

2018/01/12 12:09

php側のエラーログが欲しいです。 環境がわからないのでなんとも言えませんが、「500 Internal Server Error」はHTTPステータスコードで、クライアント側のエラーなのです。。。 このあたりを参考に探って見てください。もう少しエラーの情報があるはずです! そうすれば、何行目でエラーが出ているなども見れるので直し方も調べられると思います! https://qiita.com/iwason/items/8dc9f62b4118186cf2df
kodoumai

2018/01/12 12:15

ご指摘ありがとうございます。 エラー文を見つけましたので、追記に記載しました
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問