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

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

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

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

Q&A

解決済

2回答

1009閲覧

複数ファイルをZipにしてダウンロードしたい

miiisya

総合スコア35

PHP

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

0グッド

0クリップ

投稿2022/03/18 06:56

指定したディレクトリ以下をすべてダウンロードする処理をやりたいです。
参考をもとに、方法 1 のやり方で試しているのですが、ダウンロードしたzipを7zipで開く際に「アーカイブではありません」というエラーが出てしまい、開けません。その他の方法でzipを開こうとすると、エラーすら出ない状態です。
ダウンロード対象のフォルダ構成は以下のような形です
イメージ説明

php

1 // 丸ごと圧縮するフォルダ 2 $folder = "test"; 3 // Zip ファイル名 4 $fileName = $folder.".zip"; 5 // ファイルディレクトリ 6 $dir = "C:\Users\UserName\Desktop"; 7 // Zip ファイルパス 8 $zipPath = $dir. '\\' .$fileName; 9 $command = "cd ". $dir .";". 10 "zip -r '". $fileName . "' .\\".$folder."\\"; 11 exec($command); 12 mb_http_output( "pass" ) ; 13 header("Content-Type: application/zip"); 14 header("Content-Transfer-Encoding: Binary"); 15 header("Content-Length: ".filesize($zipPath)); 16 header('Content-Disposition: attachment; filename*=UTF-8\'\'' . $fileName); 17 header('Cache-Control: public'); 18 header('Pragma: public'); 19 ob_end_clean(); 20 readfile($zipPath); 21 // Zipファイル削除 22 unlink( $zipPath ); 23 exit;

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

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

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

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

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

miiisya

2022/03/18 07:58

情報ありがとうございます! 今回は関係なさそうでした
退会済みユーザー

退会済みユーザー

2022/03/18 08:22

exec($command); の戻り値をデバッグしてみてください。実行に失敗すると false が得られるはずですが。 PHP: exec - Manual https://www.php.net/manual/ja/function.exec
miiisya

2022/03/18 08:28

処理自体は成功しています。 ので、zipファイルを生成する過程でファイルが破損している可能性が高そうです。
退会済みユーザー

退会済みユーザー

2022/03/18 08:34

$dir で与えるディレクトリに、zip.exeとか置いてあって実行はできている、という意味でしょうか。
guest

回答2

0

$commandの実行、うまく行っていないかもしれませんね。

Windowsにサインインするユーザー環境とは異なり、
webサーバーをどのユーザー権限で動かすかにもよりますが、
ユーザー環境の環境変数PATHが使えないことを想定して、
実行するプログラムはフルパスで与える必要がありそうです。

相対パスでディレクトリ名を与えるのは、もってのほか。
コマンドを実行するディレクトリがどこになるかわかりませんよね?

あと、

header('Content-Disposition: attachment; filename*=UTF-8\'\'' . $fileName);

ファイル名を示す箇所、おかしいです。
ファイル名を与える、閉じる引用符がない。
Content-Disposition: attachment; filenameのrfc 6266形式 - Qiita
によると、ファイル名はURLエンコードしたものを与えると良いようですが。
その記事にもあって、
ダウンロードファイル名、文字化けとの格闘 - ねぎぶログ
の記事にもありますが、

Content-Disposition: attachment;
filename="ファイル名";
filename*=UTF-8''URLエンコーディングされたファイル名

だそうです。失礼しました。

投稿2022/03/18 08:30

編集2022/03/18 08:43
退会済みユーザー

退会済みユーザー

総合スコア0

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

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

0

ベストアンサー

投稿2022/03/18 07:02

yambejp

総合スコア114843

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

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

退会済みユーザー

退会済みユーザー

2022/03/18 08:32 編集

ZipArchiveクラスなら良さそう。
guest

あなたの回答

tips

太字

斜体

打ち消し線

見出し

引用テキストの挿入

コードの挿入

リンクの挿入

リストの挿入

番号リストの挿入

表の挿入

水平線の挿入

プレビュー

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

ただいまの回答率
85.48%

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

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

質問する

関連した質問