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

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

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

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

zip

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

Q&A

解決済

1回答

2173閲覧

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

take45

総合スコア30

PHP

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

zip

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

0グッド

1クリップ

投稿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

1 2 $filepaths =["./data/test1.pdf","./data/test2.pdf"]; 3 4 $zip = new ZipArchive(); 5 $zipFileName = 'test_'.date('Ymd').'.zip'; 6 $zipTmpDir = __DIR__."/tmp_zip/"; 7 $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); 8 if ($result !== true) { 9 echo 'error'; 10 } 11 set_time_limit(0); 12 foreach ($filepaths as $filepath) { 13 $filename = basename($filepath); 14 // 取得ファイルをZipに追加 15 $zip->addFromString($filename,file_get_contents($filepath)); 16 //var_dump(file_get_contents($filepath)); 17       //var_dump($zip); 18 } 19 $zip->close(); 20 header('Content-Type: application/zip; name="' . $zipFileName . '"'); 21 header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); 22 header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); 23 echo file_get_contents($zipTmpDir.$zipFileName); 24 25 unlink($zipTmpDir.$zipFileName);

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

php

1 2/var/www/html/test/public/app/zip.php:26:string '%PDF-1.7 3%���� 429 0 obj 5<</Linearized 1/L 42903/O 31/E 38213/N 1/T 42599/H [ 456 152]>> 6endobj 7 836 0 obj 9<</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 10h�bbd``b` 11� A, 12$��D�;���f`bdXR��H�q�W���O�� 13endstream 14endobj 15startxref 160 17%%EOF 18 1949 0 obj 20<</C 73/Filter/FlateDecode/I 95/Length 68/S 38>'... (length=78802) 21/var/www/html/test/public/app/zip.php:26:string '%PDF-1.7 22%���� 2329 0 obj 24<</Linearized 1/L 42903/O 31/E 38213/N 1/T 42599/H [ 456 152]>> 25endobj 26 2736 0 obj 28<</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 29h�bbd``b` 30� A, 31$��D�;���f`bdXR��H�q�W���O�� 32endstream 33endobj 34startxref 350 36%%EOF 37 3849 0 obj 39<</C 73/Filter/FlateDecode/I 95/Length 68/S 38>'... (length=78802)

foreach内の「zip」のdumpです。

php

1/var/www/html/test/public/app/zip.php:27: 2object(ZipArchive)[1] 3 public 'lastId' => int 0 4 public 'status' => int 0 5 public 'statusSys' => int 0 6 public 'numFiles' => int 1 7 public 'filename' => string '/var/www/html/test/public/app/tmp_zip/test_20210629.zip' (length=72) 8 public 'comment' => string '' (length=0) 9/var/www/html/test/public/app/zip.php:27: 10object(ZipArchive)[1] 11 public 'lastId' => int 1 12 public 'status' => int 0 13 public 'statusSys' => int 0 14 public 'numFiles' => int 2 15 public 'filename' => string '/var/www/html/test/public/app/tmp_zip/test_20210629.zip' (length=72) 16 public 'comment' => string '' (length=0) 17

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

php

1 2$filepath = "./data/test1.pdf"; 3$filename = basename($filepath); 4header('Content-Type: application/force-download'); 5header('Content-Disposition: attachment; filename="'.$filename.'"'); 6header('Content-Length: '.filesize($filepath)); 7readfile($filepath); 8

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

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

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

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

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); ありがとうございました。
guest

回答1

0

自己解決

パーミッションを設定したら動作しました。
ありがとうございました。

下記追記しました。
mkdir($zipTmpDir,0777,true);

投稿2021/06/30 00:12

take45

総合スコア30

バッドをするには、ログインかつ

こちらの条件を満たす必要があります。

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.35%

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

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

質問する

関連した質問