質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
86.12%
PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

解決済

phpで複数のファイルをzip圧縮してダウンロードしたい

take45
take45

総合スコア30

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。

1回答

0リアクション

1クリップ

1360閲覧

投稿2021/06/29 09:17

編集2021/06/29 11:11

phpで複数のファイルをまとめてダウンロードしたいのですが
zipファイルがダウンロードされるのですが「無効」のアラートが出て解凍することができません。

$result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE);
は「true」が返ってきます。

コードのどこに誤りがあるのかわかりません。
宜しくご教授ください。
よろしくお願いします。

補足:PHP Version 7.2.20

ソースは下記の通りです。

php

$filepaths =["./data/test1.pdf","./data/test2.pdf"]; $zip = new ZipArchive(); $zipFileName = 'test_'.date('Ymd').'.zip'; $zipTmpDir = __DIR__."/tmp_zip/"; $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($result !== true) { echo 'error'; } set_time_limit(0); foreach ($filepaths as $filepath) { $filename = basename($filepath); // 取得ファイルをZipに追加 $zip->addFromString($filename,file_get_contents($filepath)); //var_dump(file_get_contents($filepath));        //var_dump($zip); } $zip->close(); header('Content-Type: application/zip; name="' . $zipFileName . '"'); header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); echo file_get_contents($zipTmpDir.$zipFileName); unlink($zipTmpDir.$zipFileName);

foreach内の「file_get_contents($filepath)」のdump内容(一部文字化けしています)

php

/var/www/html/test/public/app/zip.php:26:string '%PDF-1.7 %���� 29 0 obj <</Linearized 1/L 42903/O 31/E 38213/N 1/T 42599/H [ 456 152]>> endobj 36 0 obj <</DecodeParms<</Columns 4/Predictor 12>>/Filter/FlateDecode/ID[<DFC229BA4E71C747B3519DA8B95BEDE7><5A1E6FABC2C1BF43848CEEE98A8562AC>]/Index[29 21]/Info 28 0 R/Length 55/Prev 42600/Root 30 0 R/Size 50/Type/XRef/W[1 2 1]>>stream h�bbd``b` � A, $��D�;���f`bdXR��H�q�W���O�� endstream endobj startxref 0 %%EOF 49 0 obj <</C 73/Filter/FlateDecode/I 95/Length 68/S 38>'... (length=78802) /var/www/html/test/public/app/zip.php:26:string '%PDF-1.7 %���� 29 0 obj <</Linearized 1/L 42903/O 31/E 38213/N 1/T 42599/H [ 456 152]>> endobj 36 0 obj <</DecodeParms<</Columns 4/Predictor 12>>/Filter/FlateDecode/ID[<DFC229BA4E71C747B3519DA8B95BEDE7><5A1E6FABC2C1BF43848CEEE98A8562AC>]/Index[29 21]/Info 28 0 R/Length 55/Prev 42600/Root 30 0 R/Size 50/Type/XRef/W[1 2 1]>>stream h�bbd``b` � A, $��D�;���f`bdXR��H�q�W���O�� endstream endobj startxref 0 %%EOF 49 0 obj <</C 73/Filter/FlateDecode/I 95/Length 68/S 38>'... (length=78802)

foreach内の「zip」のdumpです。

php

/var/www/html/test/public/app/zip.php:27: object(ZipArchive)[1] public 'lastId' => int 0 public 'status' => int 0 public 'statusSys' => int 0 public 'numFiles' => int 1 public 'filename' => string '/var/www/html/test/public/app/tmp_zip/test_20210629.zip' (length=72) public 'comment' => string '' (length=0) /var/www/html/test/public/app/zip.php:27: object(ZipArchive)[1] public 'lastId' => int 1 public 'status' => int 0 public 'statusSys' => int 0 public 'numFiles' => int 2 public 'filename' => string '/var/www/html/test/public/app/tmp_zip/test_20210629.zip' (length=72) public 'comment' => string '' (length=0)

単体でのダウンロードは問題なくできます。(同じパス)

php

$filepath = "./data/test1.pdf"; $filename = basename($filepath); header('Content-Type: application/force-download'); header('Content-Disposition: attachment; filename="'.$filename.'"'); header('Content-Length: '.filesize($filepath)); readfile($filepath);

以下のような質問にはリアクションをつけましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

リアクションが多い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

下記のような質問は推奨されていません。

  • 間違っている
  • 質問になっていない投稿
  • スパムや攻撃的な表現を用いた投稿

適切な質問に修正を依頼しましょう。

ockeghem

2021/06/29 09:41

$zip->close(); の返り値を確認してください。
take45

2021/06/29 10:57

var_dump($zip->close()); を実行したところ false が返ってきました。 よろしくお願いします。
ockeghem

2021/06/29 11:21

$zip->close()でfalseが返っているということは、書き込みに失敗しています。書き込みディレクトリのパーミッション設定等を見直すのが良いと思います。
take45

2021/06/30 00:09

ご回答ありがとうございます パーミッション設定したら正常に動作しました。 具体的には $zipTmpDir 作成後 下記にて権限を与えました。 mkdir($zipTmpDir,0777,true); ありがとうございました。

まだ回答がついていません

会員登録して回答してみよう

アカウントをお持ちの方は

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
86.12%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

PHP

PHPは、Webサイト構築に特化して開発されたプログラミング言語です。大きな特徴のひとつは、HTMLに直接プログラムを埋め込むことができるという点です。PHPを用いることで、HTMLを動的コンテンツとして出力できます。HTMLがそのままブラウザに表示されるのに対し、PHPプログラムはサーバ側で実行された結果がブラウザに表示されるため、PHPスクリプトは「サーバサイドスクリプト」と呼ばれています。

zip

ZIPとは、複数のファイルをひとつにまとめて圧縮したり、圧縮したファイルを展開することができるアーカイブフォーマットです。 1998年以降のWindowsOS各バージョンで、標準の圧縮フォルダとして採用されています。 MacOSでも、X v10.3以降に他の圧縮ソフトとまとめてZIP機能を採用しています。