回答編集履歴

1

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

2018/01/13 21:00

投稿

Tomak
Tomak

スコア1652

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