前提・実現したいこと
基本的にはタイトル通りなのですが、エクセルファイルを一度s3に格納しそれく取り出してローカルのストレージの中にディレクトリを作成し、各ディレクトリにエクセルファイルを保存し、それをまとめる大本のディレクトをzipファイルとしてダウロードさせたいです。
よろしくお願いします。
laravel 5.2.45
PHP 7.3.10
試したこと
最初はzipperでトライしましたが、ディレクトリとしてのzip化にかんする情報が少なかったためzipArchiveに方向性を変更しまして、以下のurlを参考に取り敢えずコードを書いてみました。
http://web-terminal.blogspot.com/2014/04/phpziparchivezip.html#I-open-a-stream-of-ZipArchive
該当のソースコード
php
1use ZipArchive; 2・ 3・ 4・ 5public static function all_zip($dir_path, $new_dir) 6 { 7 $zip = new ZipArchive(); 8 if ($zip->open($new_dir, ZipArchive::OVERWRITE) == true) { 9 self::add_zip($zip, $dir_path, ""); 10 $zip->close(); 11 } else { 12 return false; 13 } 14 } 15 private static function add_zip($zip, $dir_path, $new_dir) 16 { 17 if (!is_dir($new_dir)) { 18 $zip->addEmptyDir($new_dir); 19 } 20 21 foreach (self::get_inner_path_of_directory($dir_path) as $file) { 22 if (is_dir($dir_path . "/" . $file)) { 23 self::add_zip($zip, $dir_path . "/" . $file, $new_dir . "/" . $file); 24 } else { 25 $zip->addFile($dir_path . "/" . $file, $new_dir . "/" . $file); 26 } 27 } 28 } 29 public static function get_inner_path_of_directory($dir_path) 30 { 31 $file_array = array(); 32 if (is_dir($dir_path)) { 33 if ($dh = opendir($dir_path)) { 34 while (($file = readdir($dh)) !== false) { 35 if ($file == "." || $file == "..") { 36 continue; 37 } 38 $file_array[] = $file; 39 } 40 closedir($dh); 41 } 42 } 43 sort($file_array); 44 return $file_array; 45 } 46
上記を呼んでいる箇所
php
1//以下tmpディレクトリの中でまた複数のディレクトリの分かれておりそれぞれのディレクトリにそれぞれ複数のエクセルファイルが入っています 2$dir_path = storage_path("app/public/tmp/"); 3//以下にzipファイルを保存してダウンロードさせたら消そうを思っています。 4$new_dir = storage_path("app/public/zip/"); 5 6dd($this->all_zip($dir_path, $new_dir));
発生している問題・エラーメッセージ
private static function add_zipの中のaddEmptyDirで引っかかっているようですが、色々と書き換えても原因がわかりません。
ZipArchive::addEmptyDir(): Invalid or uninitialized Zip object
回答1件
あなたの回答
tips
プレビュー
バッドをするには、ログインかつ
こちらの条件を満たす必要があります。
2020/03/23 03:55