質問編集履歴
11
誤字修正
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
PHPでzipファイルのダウンロードがうまくできません(
|
1
|
+
PHPでzipファイルのダウンロードがうまくできません(文字化けがブラウザ上で表示される)
|
test
CHANGED
@@ -1,12 +1,7 @@
|
|
1
|
-
###
|
1
|
+
### 前提・実現したいこと
|
2
|
-
zipファイルを
|
2
|
+
ダウンロードボタンを押すとzipファイルを作成してダウンロード出来るようにしたいです。
|
3
3
|
|
4
|
-
一応PCのchromeとsafariのブラウザからダウンロードをして解凍するまでまではできました。ただIphoneのchromeからダウンロードすると、ダウンロードはできるんですがファイル名に拡張子が含まれておらずダウンロードした後に.zipを付け足して解凍をしようとしても、ファイルが壊れているのか解凍ができません。
|
5
|
-
|
6
|
-
### ~~前提・実現したいこと~~(ここの部分は解決済み)
|
7
|
-
~~ダウンロードボタンを押すとzipファイルを作成してダウンロード出来るようにしたいです。~~
|
8
|
-
|
9
|
-
|
4
|
+
下記のコードだとzipファイル作成までは出来たのですが、その後にダウンロードが始まることはなくブラウザ上にzipの中身が文字化けして表示されるだけで何も動作しません。作成できたzipファイルを直接ダウンロードして解凍してみたのですが問題なく解凍できました。なのでダウンロード周りのコードが間違っているのかもしれません。
|
10
5
|
|
11
6
|
### 該当のソースコード
|
12
7
|
```php
|
10
コード修正、実現したいこと修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -1,7 +1,7 @@
|
|
1
1
|
### 追記 2022年1月17日 前提・実現したいこと
|
2
2
|
zipファイルをIphoneのchromeからダウンロードと解凍を出来るようにしたいです。
|
3
3
|
|
4
|
-
一応PCのchromeとsafa
|
4
|
+
一応PCのchromeとsafariのブラウザからダウンロードをして解凍するまでまではできました。ただIphoneのchromeからダウンロードすると、ダウンロードはできるんですがファイル名に拡張子が含まれておらずダウンロードした後に.zipを付け足して解凍をしようとしても、ファイルが壊れているのか解凍ができません。
|
5
5
|
|
6
6
|
### ~~前提・実現したいこと~~(ここの部分は解決済み)
|
7
7
|
~~ダウンロードボタンを押すとzipファイルを作成してダウンロード出来るようにしたいです。~~
|
9
test
CHANGED
@@ -1 +1 @@
|
|
1
|
-
PHPでzipファイルのダウンロードがうまくできません
|
1
|
+
PHPでzipファイルのダウンロードがうまくできません(Iphoneのchrome)
|
test
CHANGED
@@ -1,163 +1,92 @@
|
|
1
|
-
### 前提・実現したいこと
|
1
|
+
### 追記 2022年1月17日 前提・実現したいこと
|
2
|
+
zipファイルをIphoneのchromeからダウンロードと解凍を出来るようにしたいです。
|
2
3
|
|
3
|
-
ダウンロード
|
4
|
+
一応PCのchromeとsafaliのブラウザからダウンロードをして解凍するまでまではできました。ただIphoneのchromeからダウンロードすると、ダウンロードはできるんですがファイル名に拡張子が含まれておらずダウンロードした後に.zipを付け足して解凍をしようとしても、ファイルが壊れているのか解凍ができません。
|
4
5
|
|
6
|
+
### ~~前提・実現したいこと~~(ここの部分は解決済み)
|
7
|
+
~~ダウンロードボタンを押すとzipファイルを作成してダウンロード出来るようにしたいです。~~
|
5
8
|
|
6
|
-
|
7
|
-
下記のコードだとzipファイル作成までは出来たのですが、その後にダウンロードが始まることはなくブラウザ上にzipの中身が文字化けして表示されるだけで何も動作しません。作成できたzipファイルを直接ダウンロードして解凍してみたのですが問題なく解凍できました。なのでダウンロード周りのコードが間違っているのかもしれません。
|
9
|
+
~~下記のコードだとzipファイル作成までは出来たのですが、その後にダウンロードが始まることはなくブラウザ上にzipの中身が文字化けして表示されるだけで何も動作しません。作成できたzipファイルを直接ダウンロードして解凍してみたのですが問題なく解凍できました。なのでダウンロード周りのコードが間違っているのかもしれません。~~
|
8
|
-
|
9
|
-
|
10
10
|
|
11
11
|
### 該当のソースコード
|
12
|
-
|
13
12
|
```php
|
14
|
-
|
15
13
|
<?php
|
16
|
-
|
17
14
|
$test_file = __DIR__ . '/../../../uploads/txt/test.txt';
|
18
15
|
|
19
|
-
|
20
|
-
|
21
16
|
if (isset($_POST['downloadbutton'])) {
|
22
|
-
|
23
17
|
$zip = new ZipArchive();
|
24
|
-
|
25
18
|
$zipFileName = get_the_ID() . '.zip';
|
26
|
-
|
27
19
|
$zipTmpDir = __DIR__ . '/../../../uploads/zip/';
|
28
|
-
|
29
20
|
$result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
|
30
|
-
|
31
21
|
|
32
|
-
|
33
22
|
if ($result === true) {
|
34
|
-
|
35
23
|
set_time_limit(0);
|
36
|
-
|
37
|
-
$zip->addFile($test_file,
|
24
|
+
$zip->addFile($test_file, 'test.txt');
|
38
|
-
|
39
25
|
$zip->close();
|
40
26
|
|
41
|
-
|
42
|
-
|
43
|
-
// Zip圧縮したファイルをダウンロード(この後が間違えている気がします)
|
44
|
-
|
45
|
-
// mb_output_handler("pass");
|
46
|
-
|
47
|
-
// mb_http_output("pass");
|
48
|
-
|
49
|
-
// header('Content-Type: application/zip; name="' . $zipFileName . '"');
|
50
|
-
|
51
27
|
header('Content-type: application/zip');
|
52
|
-
|
53
28
|
header('X-Content-Type-Options: nosniff');
|
54
|
-
|
55
|
-
header(
|
29
|
+
header('Content-Length: '.filesize($zipTmpDir.$zipFileName));
|
56
|
-
|
57
|
-
header('Content-Disposition: attachment; filename="'
|
30
|
+
header('Content-Disposition: attachment; filename="'.$zipFileName.'"');
|
58
|
-
|
59
31
|
header('Connection: close');
|
60
|
-
|
61
|
-
|
32
|
+
while (ob_get_level()) { ob_end_clean(); }
|
62
|
-
|
63
|
-
ob_end_clean();
|
64
|
-
|
65
33
|
readfile($zipTmpDir.$zipFileName);
|
66
|
-
|
67
|
-
unlink($zipTmpDir.$zipFileName);
|
68
|
-
|
69
|
-
exit;
|
70
|
-
|
71
34
|
}
|
72
|
-
|
35
|
+
unlink($zipTmpDir.$zipFileName);
|
36
|
+
exit;
|
73
37
|
}
|
74
|
-
|
75
38
|
?>
|
76
39
|
|
77
|
-
|
78
|
-
|
79
40
|
<form id="testdl" method="post">
|
80
|
-
|
81
41
|
<button id="button" type="submit" name="downloadbutton"><p>Download</p></button>
|
82
|
-
|
83
42
|
</form>
|
84
|
-
|
85
43
|
```
|
86
44
|
|
45
|
+
php.iniに下記を追加することで文字化けがブラウザに表示されなくなり、ダウンロード出来るようになりました。ただこの方法が正しいのか、もしくはただエラーがあるのに無理やりダウンロード出来るようにしているのか分かりません。
|
46
|
+
```php.ini
|
47
|
+
output_buffering = on
|
48
|
+
```
|
87
49
|
|
50
|
+
**参考にしたサイト**: [PHP:Warning: Cannot modify header information - headers already sent by ...の解決策](http://go4it.seesaa.net/article/73726670.html)
|
88
51
|
|
89
|
-
### 試したこと
|
52
|
+
### 試したことと結果
|
90
|
-
|
91
53
|
- いくつかのサイトを参考にしたのでいらないものを足してしまったか、もしくは引いてしまったのかと思いダウンロード周りのコードを何度も修正したのですが別のエラー(Cannot modify header information - headers already sent)が表示され結局解決できませんでした。
|
92
|
-
|
93
|
-
|
94
54
|
|
95
55
|
- while (ob_get_level()) { ob_end_clean(); } を ob_end_clean(); に変更しました。文字化けが表示されるようになりました→ PK 8b�Stest.txtPK? 8b�S��test.txtPK6&
|
96
56
|
|
97
|
-
|
98
|
-
|
99
57
|
- 上記のコードを別のphpファイルに移しfunctionにして元のファイルからincludeで呼んだんですが同じ文字化けが表示されました。
|
100
|
-
|
101
|
-
|
102
58
|
|
103
59
|
- mb_output_handler("pass"); と mb_http_output("pass"); をコメントアウトしてみましたが同じ文字化けが表示されました。
|
104
60
|
|
105
|
-
|
106
|
-
|
107
61
|
- header('Content-Type: application/zip; name="' . $zipFileName . '"'); をコメントアウトしてheader('Content-type: application/zip'); を追加してみましたが同じ文字化けが表示されました。
|
108
|
-
|
109
|
-
|
110
62
|
|
111
63
|
- サーバーのファイルパーミッションを確認したんですがダウンロード出来ない原因は見つかりませんでした。
|
112
64
|
|
113
|
-
|
114
|
-
|
115
65
|
- 私と同じようにzipの中身が文字化けしてブラウザに表示されてダウンロード出来ない方の解決済みの投稿を見つけたんですが([https://teratail.com/questions/279532](https://teratail.com/questions/279532))その方はCakePHPを使用されているみたいで、その解決策のコードを追加してもエラーが出るだけでした。
|
116
|
-
|
117
66
|
追加したコード→ Configure::write('debug', 0);
|
118
|
-
|
119
|
-
|
120
67
|
|
121
68
|
- unlink($zipTmpDir.$zipFileName); をコメントアウトし作成されたzipファイルを削除せず、そのzipファイルをhtmlコード <a href="test.zip" download>download test</a> でダウンロードしてみたんですが、それは問題なくダウンロードも解凍もできました。
|
122
69
|
|
123
|
-
|
124
|
-
|
125
70
|
- header('X-Content-Type-Options: nosniff'); を追加しました。
|
126
71
|
|
72
|
+
- php.ini に output_buffering = on を追加しました。
|
127
73
|
|
128
|
-
|
129
|
-
-
|
74
|
+
- ob_end_clean(); を再び while (ob_get_level()) { ob_end_clean(); } に戻したらダウンロードも解凍もできました。ただiphoneのchromeからだとダウンロードはできても解凍ができません。
|
130
|
-
|
131
75
|
|
132
76
|
|
133
77
|
### 補足情報(FW/ツールのバージョンなど)
|
134
|
-
|
135
78
|
phpのバージョン: 7.4.25
|
136
79
|
|
137
|
-
|
138
|
-
|
139
80
|
phpのzipのバージョン
|
140
|
-
|
141
81
|
Zip enabled
|
142
|
-
|
143
82
|
Zip version 1.15.6
|
144
|
-
|
145
83
|
Libzip headers version 1.3.2
|
146
|
-
|
147
84
|
Libzip library version 1.3.2
|
148
|
-
|
149
|
-
|
150
85
|
|
151
86
|
使用しているサーバー: Conoha Wing
|
152
87
|
|
153
|
-
|
154
|
-
|
155
88
|
使用しているEditer: Visual Studio Code
|
156
|
-
|
157
|
-
|
158
89
|
|
159
90
|
Wordpressでサイトを作っています
|
160
91
|
|
161
|
-
|
162
|
-
|
163
92
|
よろしくお願いいたします。
|
8
試したこと追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -126,6 +126,8 @@
|
|
126
126
|
|
127
127
|
|
128
128
|
|
129
|
+
- wp-config.php内に define('WP_DEBUG', false); がなかったので追加し、falseとtrue両方試してみましたが同じ文字化けが表示されました。
|
130
|
+
|
129
131
|
|
130
132
|
|
131
133
|
### 補足情報(FW/ツールのバージョンなど)
|
7
コードと試したことを追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -49,6 +49,8 @@
|
|
49
49
|
// header('Content-Type: application/zip; name="' . $zipFileName . '"');
|
50
50
|
|
51
51
|
header('Content-type: application/zip');
|
52
|
+
|
53
|
+
header('X-Content-Type-Options: nosniff');
|
52
54
|
|
53
55
|
header("Content-Length: ".filesize($zipTmpDir.$zipFileName));
|
54
56
|
|
@@ -116,6 +118,16 @@
|
|
116
118
|
|
117
119
|
|
118
120
|
|
121
|
+
- unlink($zipTmpDir.$zipFileName); をコメントアウトし作成されたzipファイルを削除せず、そのzipファイルをhtmlコード <a href="test.zip" download>download test</a> でダウンロードしてみたんですが、それは問題なくダウンロードも解凍もできました。
|
122
|
+
|
123
|
+
|
124
|
+
|
125
|
+
- header('X-Content-Type-Options: nosniff'); を追加しました。
|
126
|
+
|
127
|
+
|
128
|
+
|
129
|
+
|
130
|
+
|
119
131
|
### 補足情報(FW/ツールのバージョンなど)
|
120
132
|
|
121
133
|
phpのバージョン: 7.4.25
|
6
タグ追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -4,7 +4,7 @@
|
|
4
4
|
|
5
5
|
|
6
6
|
|
7
|
-
下記のコードだとzipファイル作成までは出来たのですが、その後にダウンロードが始まることはなく
|
7
|
+
下記のコードだとzipファイル作成までは出来たのですが、その後にダウンロードが始まることはなくブラウザ上にzipの中身が文字化けして表示されるだけで何も動作しません。作成できたzipファイルを直接ダウンロードして解凍してみたのですが問題なく解凍できました。なのでダウンロード周りのコードが間違っているのかもしれません。
|
8
8
|
|
9
9
|
|
10
10
|
|
5
試したこと追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -5,12 +5,6 @@
|
|
5
5
|
|
6
6
|
|
7
7
|
下記のコードだとzipファイル作成までは出来たのですが、その後にダウンロードが始まることはなく別のページに移り背景が白いまま何も動作しません。作成できたzipファイルを直接ダウンロードして解凍してみたのですが問題なく解凍できました。なのでダウンロード周りのコードが間違っているのかもしれません。
|
8
|
-
|
9
|
-
|
10
|
-
|
11
|
-
### 追記
|
12
|
-
|
13
|
-
色々なサイトに載っているphpでファイルをダウンロードするコードと下記のコードを見比べてみても、問題になるところが見当たらないのですがコードの原因ではなくサーバーの設定が原因でダウンロード出来ないということも考えられますでしょうか?サーバーのファイルとフォルダのパーミッションが原因かと思い確認をしたんですが特に問題はなさそうです。
|
14
8
|
|
15
9
|
|
16
10
|
|
@@ -116,6 +110,12 @@
|
|
116
110
|
|
117
111
|
|
118
112
|
|
113
|
+
- 私と同じようにzipの中身が文字化けしてブラウザに表示されてダウンロード出来ない方の解決済みの投稿を見つけたんですが([https://teratail.com/questions/279532](https://teratail.com/questions/279532))その方はCakePHPを使用されているみたいで、その解決策のコードを追加してもエラーが出るだけでした。
|
114
|
+
|
115
|
+
追加したコード→ Configure::write('debug', 0);
|
116
|
+
|
117
|
+
|
118
|
+
|
119
119
|
### 補足情報(FW/ツールのバージョンなど)
|
120
120
|
|
121
121
|
phpのバージョン: 7.4.25
|
4
追記とコード修正
test
CHANGED
File without changes
|
test
CHANGED
@@ -5,6 +5,12 @@
|
|
5
5
|
|
6
6
|
|
7
7
|
下記のコードだとzipファイル作成までは出来たのですが、その後にダウンロードが始まることはなく別のページに移り背景が白いまま何も動作しません。作成できたzipファイルを直接ダウンロードして解凍してみたのですが問題なく解凍できました。なのでダウンロード周りのコードが間違っているのかもしれません。
|
8
|
+
|
9
|
+
|
10
|
+
|
11
|
+
### 追記
|
12
|
+
|
13
|
+
色々なサイトに載っているphpでファイルをダウンロードするコードと下記のコードを見比べてみても、問題になるところが見当たらないのですがコードの原因ではなくサーバーの設定が原因でダウンロード出来ないということも考えられますでしょうか?サーバーのファイルとフォルダのパーミッションが原因かと思い確認をしたんですが特に問題はなさそうです。
|
8
14
|
|
9
15
|
|
10
16
|
|
@@ -42,11 +48,13 @@
|
|
42
48
|
|
43
49
|
// Zip圧縮したファイルをダウンロード(この後が間違えている気がします)
|
44
50
|
|
45
|
-
mb_output_handler("pass");
|
51
|
+
// mb_output_handler("pass");
|
46
52
|
|
47
|
-
mb_http_output("pass");
|
53
|
+
// mb_http_output("pass");
|
48
54
|
|
49
|
-
header('Content-Type: application/zip; name="' . $zipFileName . '"');
|
55
|
+
// header('Content-Type: application/zip; name="' . $zipFileName . '"');
|
56
|
+
|
57
|
+
header('Content-type: application/zip');
|
50
58
|
|
51
59
|
header("Content-Length: ".filesize($zipTmpDir.$zipFileName));
|
52
60
|
|
@@ -104,6 +112,10 @@
|
|
104
112
|
|
105
113
|
|
106
114
|
|
115
|
+
- サーバーのファイルパーミッションを確認したんですがダウンロード出来ない原因は見つかりませんでした。
|
116
|
+
|
117
|
+
|
118
|
+
|
107
119
|
### 補足情報(FW/ツールのバージョンなど)
|
108
120
|
|
109
121
|
phpのバージョン: 7.4.25
|
3
試したこと追加
test
CHANGED
File without changes
|
test
CHANGED
@@ -96,6 +96,14 @@
|
|
96
96
|
|
97
97
|
|
98
98
|
|
99
|
+
- mb_output_handler("pass"); と mb_http_output("pass"); をコメントアウトしてみましたが同じ文字化けが表示されました。
|
100
|
+
|
101
|
+
|
102
|
+
|
103
|
+
- header('Content-Type: application/zip; name="' . $zipFileName . '"'); をコメントアウトしてheader('Content-type: application/zip'); を追加してみましたが同じ文字化けが表示されました。
|
104
|
+
|
105
|
+
|
106
|
+
|
99
107
|
### 補足情報(FW/ツールのバージョンなど)
|
100
108
|
|
101
109
|
phpのバージョン: 7.4.25
|
2
コードを別のphpファイルに移しfanctionにして元のファイルからincludeした
test
CHANGED
File without changes
|
test
CHANGED
@@ -92,6 +92,10 @@
|
|
92
92
|
|
93
93
|
|
94
94
|
|
95
|
+
- 上記のコードを別のphpファイルに移しfunctionにして元のファイルからincludeで呼んだんですが同じ文字化けが表示されました。
|
96
|
+
|
97
|
+
|
98
|
+
|
95
99
|
### 補足情報(FW/ツールのバージョンなど)
|
96
100
|
|
97
101
|
phpのバージョン: 7.4.25
|
1
コードを変更
test
CHANGED
File without changes
|
test
CHANGED
@@ -54,7 +54,9 @@
|
|
54
54
|
|
55
55
|
header('Connection: close');
|
56
56
|
|
57
|
-
while (ob_get_level()) { ob_end_clean(); }
|
57
|
+
// while (ob_get_level()) { ob_end_clean(); }
|
58
|
+
|
59
|
+
ob_end_clean();
|
58
60
|
|
59
61
|
readfile($zipTmpDir.$zipFileName);
|
60
62
|
|
@@ -82,7 +84,11 @@
|
|
82
84
|
|
83
85
|
### 試したこと
|
84
86
|
|
85
|
-
-いくつかのサイトを参考にしたのでいらないものを足してしまったか、もしくは引いてしまったのかと思いダウンロード周りのコードを何度も修正したのですが別のエラー(Cannot modify header information - headers already sent)が表示され結局解決できませんでした。
|
87
|
+
- いくつかのサイトを参考にしたのでいらないものを足してしまったか、もしくは引いてしまったのかと思いダウンロード周りのコードを何度も修正したのですが別のエラー(Cannot modify header information - headers already sent)が表示され結局解決できませんでした。
|
88
|
+
|
89
|
+
|
90
|
+
|
91
|
+
- while (ob_get_level()) { ob_end_clean(); } を ob_end_clean(); に変更しました。文字化けが表示されるようになりました→ PK 8b�Stest.txtPK? 8b�S��test.txtPK6&
|
86
92
|
|
87
93
|
|
88
94
|
|