PHPのZipArchiveでzipが作成できない

このQ&Aのポイント
  • PHPでzipファイルを作成する際に、ZipArchiveクラスを使用していますが、closeメソッドでfalseが返ってきてしまいます。
  • ループ処理内で画像を追加しているため、容量の問題が発生している可能性があります。
  • addFileメソッドの返り値がすべてtrueなのに対して、closeメソッドのみfalseが返ってくる原因は不明です。
回答を見る
  • ベストアンサー

PHPのZipArchiveでzipが作成できない

PHPでzipファイルを作ろうと思い、以下の手順で作成しました。 $zip = new ZipArchive(); if($zip->open('./'.$zip_file, ZipArchive::CREATE | ZIPARCHIVE::OVERWRITE) === true){ while($row = $stmt->fetch()){ // いろいろと処理 $zip->addFile($file); } $zip->close(); } すると、ループ内で行っているaddFileは返り値すべてtrueなのに対して、最後のcloseでfalseが返ってきてしまいます。 ループ処理内では画像を追加しているのですが、結構数が多いので容量の問題とかあるのでしょうか。

  • PHP
  • 回答数1
  • ありがとう数2

質問者が選んだベストアンサー

  • ベストアンサー
  • WDY
  • ベストアンサー率28% (121/431)
回答No.1

try、catchしてExceptionの内容を見てはどうでしょう? PHPで難しければLinuxのZIPコマンドで圧縮してみてはどうでしょう?

ok-rjak
質問者

お礼

回答ありがとうございます。 焦って投稿しましたが、こちらのファイルパスの記述ミスでした。 お騒がせしました。

関連するQ&A

  • PHP ZIP 展開できない

    PHPで作成したZipファイルが展開できません ダブルクリックで展開すると無効ですと表示されます。 よろしくお願いします。 define("file_zone","C:/MAMP/htdocs/upload/test/"); if(isset($_POST["download"])){ $path = file_zone; $files = scandir($path); $zip = new ZipArchive($files); // Zipファイル名 $zipFileName = "file_" . date("Ymds") .'.zip'; // Zipファイル一時保存ディレクトリ $zipTmpDir = file_zone; // Zipファイルオープン $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($result !== true) { // 失敗した時の処理 } // 処理制限時間を外す set_time_limit(0); foreach ($files as $filepath) { $filename = basename($filepath); // 取得ファイルをZipに追加していく $zip->addFromString($filename,file_get_contents($filepath)); } $zip->close(); // ストリームに出力 header('Content-Type: application/zip; name="' . $zipFileName . '"'); header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); echo file_get_contents($zipTmpDir.$zipFileName); // 一時ファイルを削除しておく // unlink($zipTmpDir.$zipFileName); }

    • ベストアンサー
    • PHP
  • PHP zipファイルのダウンロード

    下記のようなPHPスクリプトにおいて、zip フォルダに画像ファイルの圧縮ファイルを 保存し、ダウンロードしたいんです。ダウンロードの動作はChrome上で確認できてますが、圧縮した、ダウンロードファイルのサイズが0KB で、空なのです。 どこが間違っているか教えていただけますか? [file_zip.php] <?php mb_internal_encoding("UTF-8"); $ftp = ftp_connect("~"); ftp_login($ftp, "~", "~"); $dir = '/storage2/zip'; ftp_chdir($ftp, $dir); // ディレクトリ移動 // Zipクラスロード $zip = new ZipArchive(); // Zipファイル名 $zipFileName = $_POST['zip_filename']; var_dump($zipFileName); // Zipファイル一時保存ディレクトリ $zipTmpDir = '/storage2/zip'; // Zipファイルオープン $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($result !== true) { // 失敗した時の処理 echo '圧縮ファイルをオープンできませんでした'; exit(); } // ここでDB等から画像イメージ配列を取ってくる $image_data_array = array(); array_unshift($image_data_array, $zipTmpDir.$zipFileName); // 処理制限時間を外す set_time_limit(0); foreach ($image_data_array as $filepath) { $filename = basename($filepath); // 取得ファイルをZipに追加していく $zip->addFromString($filename,file_get_contents($filepath)); } $zip->close(); // ストリームに出力 header('Content-Type: application/zip; name="' . $zipFileName . '"'); header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); echo file_get_contents($zipTmpDir.$zipFileName); // 一時ファイルを削除しておく unlink($zipTmpDir.$zipFileName); // header("Location: storage.php"); ?>

    • 締切済み
    • PHP
  • PHPの書き方について

    PHPを独学で勉強中で、気になったことがあるので質問させていただきます。 最初に買った書籍とその次に買った書籍で書き方が違うところがあるので、普通はどちらでやるのか、また、使い分けがあるのかが知りたいです。 たとえば、データベースを1行ずつ取り出す処理で、1冊目では $pdo = new PDO($dnsinfo,$USER,$PW); $sql = "SELECT * FROM ○○"; $stmt = $pdo->prepare($sql); $stmt->execute(null); $res = ""; while($row = $stmt->fetch(PDO::FETCH_ASSOC)){ $res .= $row['△△'] ."," .$row['□□'] ."<br>\n"; } ・・・というコードがあったのですが、2冊目には同じような処理が mysqli_fetch_assoc()を使って書かれていたり、 接続の仕方も1冊目では「new PDO($dnsinfo,$USER,$PW);」を使って書かれているのが、2冊目では「mysqli_connect()」になっていたり、 他にも同じような処理がよく似たコードで書かれています。 調べてみると、PHP5.5から1冊目のやり方になった・・・ような記事を見つけたのですが、どちらの本もPHP5.5と書いてあり、いまいちよくわかりません。 詳しい方いらっしゃいましたらご教示お願いいたします。

    • ベストアンサー
    • PHP
  • PHP Zip 開かない

    よろしくお願いします。現在ZIPにしたものをheaderで出力したいのですが、 その場で解凍した際にフォルダを開くことができません無効ですと表示されます。 原因がわからず困っています。ヒントでも頂ければ助かります。 if(isset($_POST["upload"])){ $dir = file_zone; // Zipファイルの保存先 $file = "./Zipfile/" . date("his") .'.zip'; $root = ""; zipDirectory($dir, $file,$root); } function zipDirectory($dir, $file, $root){ $zip = new ZipArchive(); $res = $zip->open($file, ZipArchive::CREATE); if($res){ // $rootが指定されていればその名前のフォルダにファイルをまとめる if($root != "") { $zip->addEmptyDir($root); $root .= DIRECTORY_SEPARATOR; } $baseLen = mb_strlen($dir); $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir, FilesystemIterator::SKIP_DOTS |FilesystemIterator::KEY_AS_PATHNAME |FilesystemIterator::CURRENT_AS_FILEINFO ), RecursiveIteratorIterator::SELF_FIRST ); $list = array(); foreach($iterator as $pathname => $info){ $localpath = $root . mb_substr($pathname, $baseLen); if( $info->isFile() ){ $zip->addFile($pathname, $localpath); } else { $res = $zip->addEmptyDir($localpath); } } $zip->close(); } else { return false; } header('Content-Type: application/octet-stream'); header(sprintf('Content-Disposition: attachment; filename="%s"',basename($file))); header(sprintf('Content-Length: %d', filesize($file)) ); readfile($file); }

    • ベストアンサー
    • PHP
  • Zip名 日付

    失礼します、現在指定したディレクトリにzipファイルを作成しているのですが、Zip名の頭に日付を付けたいです。 dateを使用しているのですが上手くいきませんストリームに出力する際のファイル名にdateはうまくいきましたが指定したディレクトリに保存した際のファイル名がうまくいきません。 自身でZipファイルの保存先にdateを使用してみましたがエラーが出てしまいます。 よろしくお願いします。 if(isset($_POST["upload"])){ $dir = file_zone; // Zipファイルの保存先 $file = './Zipfile/test.zip'; $root = ""; zipDirectory($dir, $file,$root); } function zipDirectory($dir, $file, $root){ $zip = new ZipArchive(); $res = $zip->open($file, ZipArchive::CREATE); if($res){ // $rootが指定されていればその名前のフォルダにファイルをまとめる if($root != "") { $zip->addEmptyDir($root); $root .= DIRECTORY_SEPARATOR; } $baseLen = mb_strlen($dir); $iterator = new RecursiveIteratorIterator( new RecursiveDirectoryIterator( $dir, FilesystemIterator::SKIP_DOTS |FilesystemIterator::KEY_AS_PATHNAME |FilesystemIterator::CURRENT_AS_FILEINFO ), RecursiveIteratorIterator::SELF_FIRST ); $list = array(); foreach($iterator as $pathname => $info){ $localpath = $root . mb_substr($pathname, $baseLen); if( $info->isFile() ){ $zip->addFile($pathname, $localpath); } else { $res = $zip->addEmptyDir($localpath); } } $zip->close(); } else { return false; } header('Content-Type: application/octet-stream'); header(sprintf('Content-Disposition: attachment; filename="%s"', date(ymdhis).basename($file))); header(sprintf('Content-Length: %d', filesize($file)) ); readfile($file); }

    • ベストアンサー
    • PHP
  • PHP 再帰的 ZipArchive

    現在サブディレクトリの中のファイルも含めZipファイルを作成していのですがうまくいきません 説明がうまくできませんが下記のサブディレクトリのtestだけが表示されファイルが取得できません。できればpath_uploadの中を階層を変えずzipで圧縮して取得したいです。 なにとぞよろしくお願いします。 path_upload----test-----test.txt |--test2.txt |--test3.txt コード define("file_zone","C:/MAMP/htdocs/upload/path_upload"); if(isset($_POST["download"])){ $path = file_zone; $files = scandir($path); $zip = new ZipArchive($files); // Zipファイル名 $zipFileName = date("Ymd") .'.zip'; // Zipファイル一時保存ディレクトリ $zipTmpDir = file_zone; // Zipファイルオープン $result = $zip->open($zipTmpDir.$zipFileName, ZIPARCHIVE::CREATE | ZIPARCHIVE::OVERWRITE); if ($result !== true) { // 失敗した時の処理 } // 処理制限時間を外す set_time_limit(0); foreach ($files as $filepath) { $filename = basename($filepath); // 取得ファイルをZipに追加していく $zip->addFromString($filename,file_get_contents($filepath)); } $zip->close(); // ストリームに出力 if(ini_get('zlib.output_compression')) ini_set('zlib.output_compression', 'Off'); header('Content-Type: application/zip; name="' . $zipFileName . '"'); header('Content-Disposition: attachment; filename="' . $zipFileName . '"'); header('Content-Length: '.filesize($zipTmpDir.$zipFileName)); echo file_get_contents($zipTmpDir.$zipFileName); // 一時ファイルを削除しておく // unlink($zipTmpDir.$zipFileName); }

    • ベストアンサー
    • PHP
  • C# フォルダを含まないzipは?

    C#で作成した、CSVをFTPでウェブサーバにアップロードするプログラムがあるのですが、 運用と共にCSVファイルのサイズと数が増えパフォーマンスが悪くなってきたので、 CSVをZIPで圧縮することにしました。 C:\data\read.csv を読み込んで同じ場所に write.zip として出力するという処理を、 System.IO.Compression 系の ZipArchive を使って、   using (var zipStream = File.Create(@"C:\data\write.zip")) {     using (var archive = new ZipArchive(zipStream, ZipArchiveMode.Create)) {       var entry = archive.CreateEntry("read.csv");       using (var sourceStream = File.OpenRead(@"C:\data\read.csv")) {         using (var entryStream = entry.Open()) {           sourceStream.CopyTo(entryStream);         }       }     }   } のようにしてみたところ、C:\data\write.zip は作成されるのですが、 これを解凍すると write\read.csv となってしまいます。 (write フォルダができて、その下に元のCSVができる。) 解凍した際にフォルダを含まないように (フォルダを含んだ圧縮ファイルにならないように) 圧縮することはできませんでしょうか? よろしくお願いします。

  • PHPでDBから比較結果を取得する関数が作りたい

    タイトルの通りで、まず、データベース(MySQL)の例を以下。 ユーザー    単語  田中    初志貫徹  鈴木    一石二鳥  品川    四面楚歌 /***以下省略****/ のような感じでデータが入っています。 (なお、ユーザーは一意な値となっています。単語は重複します。およそ2万件登録されています。) ユーザーの名前を入力するとDB内を参照し、その組となる単語を出力する関数を考えています。 一応、以下のように作ってみたのですが、5つのテストデータを呼び出すだけで、3sもかかってしまいました。(PHP ver 5.4.1.6 eAccelerator適応済み環境にて確認) 比較処理の速度が遅く、使い物になりません。 もっと実行速度が速くなるような書き方を教えていただけないでしょうか? よろしくお願いいたします。m(_ _)m /************以下、関数のソースコード*********/ function conp_db($name){ //DBアクセス用変数 $cflag=true; $host = HOST; $user = USER; $password = PASSWORD; $database = DB; $table = TABLE; $data=''; $res = mysqli_connect($host, $user, $password,$database); if(!$res) { printf("MYSQLの接続に失敗しました。: %s\n",mysqli_connect_error()); exit(); } mysqli_set_charset($res,'utf8'); if($stmt = mysqli_prepare($res, "SELECT user,word from {$table}")) { mysqli_stmt_execute($stmt); //取得変数固定 mysqli_stmt_bind_result($stmt,$row['user'],$row['word']); while (mysqli_stmt_fetch($stmt) and $cflag) { if($name === $row['user'] and $cflag){ $data = $row[word']; $cflag = false; }else{ $data = 'nobody'; } } mysqli_stmt_close($stmt); } mysqli_close($res); return $data; }

    • ベストアンサー
    • PHP
  • 【PHP】ダウンロードサイト作成中!zip開けない

    PHPについて質問です。 MSG,ZIPファイルダウンロードサイト作成しております。 ダウンロードして指定のフォルダに格納するところまではできました。 プログラムには、 $file_name= mb_convert_encoding($file_name,"sjis-win","UTF-8"); これを記載しています。 ダウンロードしたファイルをクリックすると、 「テキストファイル処理の確認」という、 文字コードを選択できるダイヤログが出てきます。 それを押しても開くことはできません。 どうしたらいいのでしょうか? 説明不足かと思いますので、ヒントだけでも教えていただけるとありがたいです。

    • ベストアンサー
    • PHP
  • Powershellでzip圧縮が出来ない

    Powershellでzip圧縮しようとしているのですが、 ・Powershell ISEで実行すると正常に圧縮 ・コマンドプロンプトで実行すると、「圧縮(zip形式)フォルダーエラー」が発生し、圧縮できない という現象が発生しています。コマンドプロンプトで実行できるようにしたいのですが、原因がわからないので、御教示をお願いします。 ・環境 Windows XP SP3 Powershell 2.0 ・Powershellソース # 引数チェック # 引数の数が2以外の時は異常終了 if ($args.Length -ne 2 ) { write-host "引数エラー" exit 2; } # 圧縮zipファイル名 $ZipFilePath = $Args[0] # 圧縮対象ファイル名 $TargetItems = $Args[1] # 圧縮先パス存在チェック if((Test-Path (Split-Path $ZipFilePath -Parent)) -ne $True){ write-host "圧縮先パスエラー" exit 3; } # 圧縮対象ファイル存在チェック if((Test-Path ($TargetItems)) -ne $True){ write-host "圧縮対象ファイルエラー" exit 4; } # Zipファイルが存在する場合は削除 if(Test-Path -Path $ZipFilePath) { Remove-Item -Path $ZipFilePath } # Zipファイル作成 Set-Content $ZipFilePath ("PK" + [char]5 + [char]6 + ("$([char]0)" * 18)) (dir $ZipFilePath).IsReadOnly = $false # Zipファイルにファイルを投入 $shell = New-Object -com Shell.Application $zipfile = $shell.NameSpace($ZipFilePath) $archivedItems = New-Object Collections.ArrayList # 圧縮対象ファイルの数だけループ foreach($item in ($TargetItems | %{Get-Item -Path $_})) { # ファイルをZipファイルに投入。圧縮処理は非同期なので、その終了を待つ。 $archivedItems.Add($item) | Out-Null $zipfile.CopyHere($item.FullName) while($true) { if($archivedItems.Count -eq $zipfile.Items().Count) { break } Start-Sleep -Seconds 1 } } write-host "処理終了" exit 0

専門家に質問してみよう