質問するログイン新規登録

回答編集履歴

1

Windows版PHPの場合について編集

2018/01/13 21:00

投稿

Tomak
Tomak

スコア1652

answer CHANGED
@@ -1,63 +1,21 @@
1
+ コメントでWindows版PHP環境だと教えていただいたので、解決済みですが回答を編集しておきます。
1
- 回答にはなってないですが、Laravel-5.1で再現できませんでした。Laravel-5.1ソースとSymfony-2.7のソースをみましてすでにマチバトUTF-8対応済みあったこを確認ししたパッケージがLaravel-5.1の最新版ではないのでしょう
2
+ Windows版PHP環境場合ファイ名取得の際、日本語ファル名はCP932(SJIS-WIN)なの日本語ファイル名の文字コード変換すれば動く思い現在試せないのでなかったらすみません。
2
- [https://github.com/laravel/framework/blob/5.1/composer.json](https://github.com/laravel/framework/blob/5.1/composer.json)
3
3
 
4
- もしパッケジが最新版ではない場合、下記のようにアップデートをしてみてはいかがでしょうか?
4
+ 1. 日本語ファイル名文字コド:CP932(SJIS-WIN)
5
+ 1. PHP文字コード:UTF-8
5
6
 
6
- ```bash
7
- cd プロジェクトディレクトリ
8
- #バージョン確認
9
- php artisan --version
10
7
 
11
- #5.1最新版にアップデート
12
- composer self-update
8
+ #### Laravel,Symfony関連ソース
13
- composer update
14
- ```
15
9
 
16
- 私の手元の環境で **Laravel-5.1(v5.1.46)** を新規インストールしてから実際に試してみましたが、特になんの設定もせずに日本語ファイルをダウンロードできました。
17
-
18
- ```php
19
- $filePath = storage_path().'/app/public/history/ほげほげ.xls';
20
- return response()->download($filePath);
21
- ```
22
-
23
- **Laravel,Symfony関連ソース**
24
10
  1. Illuminate\Routing\ResponseFactory::download()
11
+ 1. Symfony\Component\HttpFoundation\BinaryFileResponse::setFile()
12
+ 1. Symfony\Component\HttpFoundation\File\File(\SplFileInfo拡張 ←ここでファイルパス設定)
25
- 2. Symfony\Component\HttpFoundation\BinaryFileResponse::setContentDisposition()
13
+ 1. Symfony\Component\HttpFoundation\BinaryFileResponse::setContentDisposition()
26
14
 
27
15
 
28
- #### エラーメッセージについて
16
+ #### ResponseMacroServiceProvider.php
29
17
 
30
- 質問文のエラーメッセージですが、わかりやすく改行をつけると下記のようになります。
31
-
32
- 1. ResponseMacroServiceProvider.phpエラー(27行目)
33
- 1. DBコネクションエラー
34
-
35
- ```
36
- # ResponseMacroServiceProvider.phpエラー(27行目)
37
- =================================================
38
- [Fri Jan 12 21:13:21.593528 2018] [:error] [pid 41704:tid 1948] [client ::1:55594]
39
- PHP Fatal error:
40
- Class App\Providers\ResponseMacroServiceProvider contains 1 abstract method ... (Illuminate\Support\ServiceProvider::register)
41
- in app\Providers\ResponseMacroServiceProvider.php on line 27
42
-
43
- # DBコネクションエラー
44
- =================================================
45
- [Fri Jan 12 21:13:21.610530 2018] [:error] [pid 41704:tid 1948] [client ::1:55594]
46
- PHP Fatal error: Uncaught Error:
47
- Call to a member function connection() on null in Illuminate\Database\Eloquent\Model.php:3224
48
- Stack trace:
49
- #0 Illuminate\Database\Eloquent\Model.php(3190): Illuminate\Database\Eloquent\Model::resolveConnection(NULL)
50
- #1 Illuminate\Database\Eloquent\Model.php(1870): Illuminate\Database\Eloquent\Model->getConnection()
51
- #2 Illuminate\Database\Eloquent\Model.php(1813): Illuminate\Database\Eloquent\Model->newBaseQueryBuilder()
52
- #3 Illuminate\Database\Eloquent\Model.php(1432): Illuminate\Database\Eloquent\Model->newQueryWithoutScopes()
53
- #4 app\Exceptions\Handler.php(44): Illuminate\Database\Eloquent\Model->save()
54
- #5 Illuminate\Foundation\Bootstrap\HandleExceptions.php(79): App\Exceptions\Handler in Illuminate\Database\Eloquent\Model.php on line 3224, referer:
55
- ```
56
-
57
-
58
- #### ResponseMacroServiceProvider.phpも確認
59
-
60
- 他の回答者の方の回答にあった`ResponseMacroServiceProvider.php`も試してみまして問題な動くこと確認コントローラーアクションメソッド質問のコードと同じよう設定しした。
18
+ 他の回答者の方の回答にあった`ResponseMacroServiceProvider.php`を使う場合ちょっと編集が必要になりす。変更ない場合は最初に`\SplFileInfo`インスタンス作成て第1引数に渡ます(こ第2引数を絶対渡さなければいけせん)
61
19
  [https://qiita.com/zeriyoshi/items/8b031b9c4a5a068fe0e4](https://qiita.com/zeriyoshi/items/8b031b9c4a5a068fe0e4)
62
20
 
63
21
  ```php
@@ -90,10 +48,17 @@
90
48
  //ファサードでも可
91
49
  Response::macro('download', function($file, $name = null, array $headers = array(), $disposition = 'attachment')
92
50
  {
51
+ //PHP側はUTF-8だと想定(※違う場合は変更)
52
+ if (false !== strpos(PHP_OS, 'WIN') && is_string($file)) {
53
+ if (empty($name)) {
54
+ $name = basename($file);
55
+ }
56
+ $file = new \SplFileInfo(mb_convert_encoding($file, 'SJIS-win', 'UTF-8'));
57
+ }
58
+
93
59
  $response = new BinaryFileResponse($file, 200, $headers, true);
94
60
 
95
- if (is_null($name))
61
+ if (empty($name)) {
96
- {
97
62
  $name = basename($file);
98
63
  }
99
64