前提・実現したいこと
PHPでサーバーにアップしている複数のファイルをzipに圧縮してダウンロード出来るようにしたいです。
発生している問題・エラーメッセージ
**追記**************** ファイルパスの中にすでにファイル名が含まれているのに、zipにファイルを追加する際さらにファイル名をaddしてファイル名が二重になっていました。 なのでこのコードを $zip->addFile($filepath.$filename,$filename); ↓ これに直しました $zip->addFile($filepath,$filename); またファイルパスも絶対パスに戻しました。 この修正でzipファイルの作成は成功したんですが、ダウンロードに失敗します。 ダウンロード中にsafariブラウザにthe operation couldn't be completedというメッセージが表示されストップします。Reloadボタンを押しダウンロードを再開するとDecompression failedと表示されダウンロードに失敗し解凍することもできません。 ファイルマネージャーでサーバーから直接圧縮されたzipをダウンロードすると普通に解凍できました。 **ここまで追記****************** zipをダウンロードすると壊れていて解凍することができません。圧縮するファイル数を変えても必ずzipのファイルサイズが17KBなので、もしかしたらファイルを追加出来ていないのかもしれません。ファイルパスが間違っていると思い何度も修正したのですが結果は変わらずでした。
該当のソースコード
PHP
1<?php 2// Zipクラスロード 3$zip = new ZipArchive(); 4// Zipファイル名 5$zipFileName = get_the_ID() . '.zip'; 6// Zipファイル一時保存ディレクトリ 7$zipTmpDir = dirname(__FILE__) ."/../../../../uploads/zip"; 8 9// Zipファイルを新規作成、または存在すれば上書きで開く 10$zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); 11 12// 処理制限時間を外す 13set_time_limit(0); 14 15// zipにファイルを追加 16foreach ($urls as $url) { 17 // ファイルURLからファイル名とフォルダ名を取得 18 $filename = basename($url); 19 $filenamenum = mb_strlen($filename) + 9; 20 //ファイル名とフォルダ名からファイルパスを取得 21 $filepath = dirname(__FILE__) ."/../../../../uploads" . mb_substr("$url", -$filenamenum); 22 23 // 取得ファイルをZipに追加していく 24 $zip->addFile($filepath.$filename,$filename); 25} 26$zip->close(); 27 28// Zip圧縮したファイルをダウンロード 29mb_output_handler("pass"); 30// ファイルタイプを指定 31header('Content-Type: application/zip; name="' . $zipFileName . '"'); 32// ファイルのダウンロード、リネームを指示 33header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); 34// ファイルサイズを取得し、ダウンロードの進捗を表示 35header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); 36mb_http_output( "pass" ) ; 37// ファイルを出力する前に、バッファの内容をクリア(ファイルの破損防止) 38ob_end_clean(); 39readfile($zipTmpDir.$zipFileName); 40 41 42// 一時ファイルを削除しておく 43unlink($zipTmpDir.$zipFileName); 44exit();
試したこと
-ファイルパスを変更
このファイルパスから
/home/folder/folder/folder/folder/uploads
↓
このファイルパスに変更しました
dirname(FILE) ."/../../../../uploads"
上記のパスの最後にファイルURLから取ったファイル名とファイルごとに異なるフォルダ名を追加してファイルパスとして使用しています。
-zipファイルの破損防止のために下記のコードを追加
mb_output_handler("pass");
mb_http_output( "pass" ) ;
ob_end_clean();
-圧縮ファイルの変更
上記のパスの記述方法が正しくないのかと思い、このphpファイルと同じフォルダにtxtファイルを配置しシンプルなパスに変更し、それをzipに追加してダウンロードしてみたのですが変わらず17KBで解凍できませんでした。
補足情報(FW/ツールのバージョンなど)
phpのバージョン: 7.4.14
phpのzipのバージョン
Zip enabled
Zip version 1.15.6
Libzip headers version 1.3.2
Libzip library version 1.3.2
使用しているサーバー: Conoha Wing
使用しているEditer: Adobe Dreamweaver
Wordpressでサイトを作っています
よろしくお願いいたします。
回答1件
あなたの回答
tips
プレビュー