前提・実現したいこと
ダウンロードボタンを押すとzipファイルを作成してダウンロード出来るようにしたいです。
下記のコードだとzipファイル作成までは出来たのですが、その後にダウンロードが始まることはなくブラウザ上にzipの中身が文字化けして表示されるだけで何も動作しません。作成できたzipファイルを直接ダウンロードして解凍してみたのですが問題なく解凍できました。なのでダウンロード周りのコードが間違っているのかもしれません。
該当のソースコード
php
1<?php 2$test_file = __DIR__ . '/../../../uploads/txt/test.txt'; 3 4if (isset($_POST['downloadbutton'])) { 5 $zip = new ZipArchive(); 6 $zipFileName = get_the_ID() . '.zip'; 7 $zipTmpDir = __DIR__ . '/../../../uploads/zip/'; 8 $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); 9 10 if ($result === true) { 11 set_time_limit(0); 12 $zip->addFile($test_file, 'test.txt'); 13 $zip->close(); 14 15 header('Content-type: application/zip'); 16 header('X-Content-Type-Options: nosniff'); 17 header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); 18 header('Content-Disposition: attachment; filename="'.$zipFileName.'"'); 19 header('Connection: close'); 20 while (ob_get_level()) { ob_end_clean(); } 21 readfile($zipTmpDir.$zipFileName); 22 } 23 unlink($zipTmpDir.$zipFileName); 24 exit; 25} 26?> 27 28<form id="testdl" method="post"> 29 <button id="button" type="submit" name="downloadbutton"><p>Download</p></button> 30</form>
php.iniに下記を追加することで文字化けがブラウザに表示されなくなり、ダウンロード出来るようになりました。ただこの方法が正しいのか、もしくはただエラーがあるのに無理やりダウンロード出来るようにしているのか分かりません。
php.ini
1output_buffering = on
参考にしたサイト: PHP:Warning: Cannot modify header information - headers already sent by ...の解決策
試したことと結果
-
いくつかのサイトを参考にしたのでいらないものを足してしまったか、もしくは引いてしまったのかと思いダウンロード周りのコードを何度も修正したのですが別のエラー(Cannot modify header information - headers already sent)が表示され結局解決できませんでした。
-
while (ob_get_level()) { ob_end_clean(); } を ob_end_clean(); に変更しました。文字化けが表示されるようになりました→ PK 8b�Stest.txtPK? 8b�S��test.txtPK6&
-
上記のコードを別のphpファイルに移しfunctionにして元のファイルからincludeで呼んだんですが同じ文字化けが表示されました。
-
mb_output_handler("pass"); と mb_http_output("pass"); をコメントアウトしてみましたが同じ文字化けが表示されました。
-
header('Content-Type: application/zip; name="' . $zipFileName . '"'); をコメントアウトしてheader('Content-type: application/zip'); を追加してみましたが同じ文字化けが表示されました。
-
サーバーのファイルパーミッションを確認したんですがダウンロード出来ない原因は見つかりませんでした。
-
私と同じようにzipの中身が文字化けしてブラウザに表示されてダウンロード出来ない方の解決済みの投稿を見つけたんですが(https://teratail.com/questions/279532)その方はCakePHPを使用されているみたいで、その解決策のコードを追加してもエラーが出るだけでした。
追加したコード→ Configure::write('debug', 0);
-
unlink($zipTmpDir.$zipFileName); をコメントアウトし作成されたzipファイルを削除せず、そのzipファイルをhtmlコード <a href="test.zip" download>download test</a> でダウンロードしてみたんですが、それは問題なくダウンロードも解凍もできました。
-
header('X-Content-Type-Options: nosniff'); を追加しました。
-
php.ini に output_buffering = on を追加しました。
-
ob_end_clean(); を再び while (ob_get_level()) { ob_end_clean(); } に戻したらダウンロードも解凍もできました。ただiphoneのchromeからだとダウンロードはできても解凍ができません。
補足情報(FW/ツールのバージョンなど)
phpのバージョン: 7.4.25
phpのzipのバージョン
Zip enabled
Zip version 1.15.6
Libzip headers version 1.3.2
Libzip library version 1.3.2
使用しているサーバー: Conoha Wing
使用しているEditer: Visual Studio Code
Wordpressでサイトを作っています
よろしくお願いいたします。
回答3件
あなたの回答
tips
プレビュー