
指定したディレクトリ以下をすべてダウンロードする処理をやりたいです。
参考をもとに、方法 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;

Content-Transfer-Encoding はメール用だからつけなくていい、って言説があります:CSVダウンロードのときにつけるヘッダ · sacre https://dream-yt.github.io/post/browser-download-http-header/
情報ありがとうございます!
今回は関係なさそうでした

exec($command); の戻り値をデバッグしてみてください。実行に失敗すると false が得られるはずですが。 PHP: exec - Manual https://www.php.net/manual/ja/function.exec
処理自体は成功しています。
ので、zipファイルを生成する過程でファイルが破損している可能性が高そうです。

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

回答2件
あなたの回答
tips
プレビュー