回答編集履歴
1
Windows版PHPの場合について編集
answer
CHANGED
@@ -1,63 +1,21 @@
|
|
1
|
+
コメントでWindows版PHP環境だと教えていただいたので、解決済みですが回答を編集しておきます。
|
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
|
-
|
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
|
-
|
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 (
|
61
|
+
if (empty($name)) {
|
96
|
-
{
|
97
62
|
$name = basename($file);
|
98
63
|
}
|
99
64
|
|