9

ZipArchive を使用しています。

function zip_dir($source, $target){

    $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST);

    $zip = new \ZipArchive();
    if($zip->open($target, \ZipArchive::CREATE) !== true)
      exit('cannot create zip');

    foreach($iterator as $file){
      $zip->addFile($file);
      print $file . '<br>';
    }


    $zip->close();
    return $target;
}


zip_dir(__DIR__ . '/test/', __DIR__ . '/testarchive.zip');

ファイルの一覧は見えるのですが、結局作成したはずのzipファイルが見つかりません。そして、ZipArchive からエラー/例外は発生しません...

編集:

print $zip->getStatusString();後に追加しました$zip->close();

そして、それは出力します:ファイルを開くことができません:許可が拒否されました」。それはどういう意味ですか?私は確かにすべてのディレクトリが書き込み可能であることを知っています.bc私はそれらの中にPHPを含む新しいファイルを作成できます...

編集2:

if(is_writable(dirname($target)))
  print 'target dir is writable...';

それを出力するので、dirは書き込み可能です。トワイライトゾーンにいるような気がします...

4

3 に答える 3

10

php.net からの 2 つのコメント

複数のファイルを zip に追加していて、$zip->close()呼び出しが FALSE を返す場合は、追加したすべてのファイルが実際に存在することを確認してください。$zip->addFile()ファイルが実際に存在しない場合でも、明らかに TRUE を返します。file_exists()各ファイルを呼び出す前に、またはis_readable()呼び出す前に各ファイルをチェックすることをお勧めします$zip->addFile()

皆さん、zip が空でないことを確認することを忘れないでください。空でない場合、zip はまったく作成されず、サーバーは警告を発しません!

于 2012-10-15T12:07:22.263 に答える
6

zipファイルへの書き込み、またはzipファイルの読み取りに問題があるようです。

file_exists、、の組み合わせを使用してis_readableis_writableこれらのどれが問題を引き起こしているのかを特定します。

function zip_dir($source, $target){

    $iterator = new \RecursiveIteratorIterator(new \RecursiveDirectoryIterator($source, \FilesystemIterator::SKIP_DOTS), \RecursiveIteratorIterator::SELF_FIRST);

    $zip = new \ZipArchive();
    if($zip->open($target, \ZipArchive::CREATE) !== true)
      exit('cannot create zip');

    foreach($iterator as $file){
      if (!file_exists($file)) { die($file.' does not exist'); }
      if (!is_readable($file)) { die($file.' not readable'); }
      $zip->addFile($file);
      print $file . '<br>';
    }


    $zip->close();
    return $target;
}

if (!is_writable(__DIR__)) { die('directory not writable'); }
zip_dir(__DIR__ . '/test/', __DIR__ . '/testarchive.zip');
于 2012-10-15T15:19:49.713 に答える