web-dev-qa-db-ja.com

Zipの作成時にエラーは発生しませんが、作成されません

このコードを作成して、Zipファイルを作成して保存しました。しかし、どういうわけか、エラーは表示されませんが、Zipファイルも作成されません。コードは次のとおりです。

$Zip = new ZipArchive;
$time = microtime(true);
$res = $Zip->open("maps/zips/test_" . $time . ".Zip", ZipArchive::CREATE);
if ($res === TRUE) {
    echo "RESULT TRUE...";
    $Zip->addFile("maps/filename.ogz","filename.ogz"); //Sauerbraten map format
    $Zip->addFromString('how_to_install.txt', 'Some Explanation...');
    $Zip->close();
    $Zip_created = true;
    echo "FILE ADDED!";
}

何が間違っているのですか、どうすれば修正できますか?

19
Florian Müller

おそらく、Apacheまたはphpには、そのディレクトリにZipアーカイブを作成する権限がありません。 ZipArchice :: open :に関するコメントの1つから

書き込んだり保存したりするディレクトリに正しい権限が設定されていない場合、エラーメッセージは表示されず、すべてが正常に機能しているように見えます...変更されていないことを除いて!

代わりに、ZipArchive :: close()の戻り値を必ず収集してください。それが間違っている場合...それは機能しませんでした。

Ifステートメントにelse句を追加し、$ resをダンプして結果を確認します。

if($res === TRUE) {
    ...
} else {
    var_dump($res);
}
15
alexn

Zipでエラーが発生しない場合が2つあります。

  1. Zipに追加するすべてのファイルが有効であることを確認してください。 1つのファイルが利用できない場合でも
    Zip->closeが呼び出されると、アーカイブは失敗し、Zipファイルは作成されません。
  2. フォルダに書き込み権限がない場合、Zipはエラーを報告しません。終了しますが、何も作成されません。
9
user1720209

$ Zip-> addFileを呼び出す前に、各ファイルが存在することを確認してください。存在しない場合、Zipは生成されず、エラーメッセージは表示されません。

if(file_exists($fichier->url))
{
    if($Zip->addFile($fichier->url,$fichier->nom))
    {
        $erreur_ouverture = false;
    }
    else
    {
        $erreur_ouverture = true;
        echo 'Open error : '.$fichier->url;
    }
}
else
{
    echo 'File '.$fichier->url.' not found';
}
8
Pascal Messana

完全な書き込み/読み取り権限がある場合でも、まったく同じ問題が発生しました。

ZipArchiveに渡す前に手動で「.Zip」ファイルを作成することで解決しました。

$Zip = new ZipArchive;
$time = microtime(true);
$path = "maps/zips/test_" . $time . ".Zip"

touch($path);  //<--- this line creates the file

$res = $Zip->open($path, ZipArchive::CREATE);
if ($res === TRUE) {
    echo "RESULT TRUE...";
    $Zip->addFile("maps/filename.ogz","filename.ogz"); //Sauerbraten map format
    $Zip->addFromString('how_to_install.txt', 'Some Explanation...');
    $Zip->close();
    $Zip_created = true;
    echo "FILE ADDED!";
}
5
Bob

それをステップに分割します。

if ($res === TRUE) {

  check if file_exist

check if addFile give any error
}

if($Zip->close())
{
 $Zip_created = true; 
    echo "FILE ADDED!"
}

Zipのphpinfoが有効になっているかどうかを確認してください:)

1
zod

Zipファイルが作成されない理由の1つは、ディレクトリではなくファイルを追加するかどうかのチェックが欠落しているためです。

if (!$file->isDir())

私は解決策を見つけました ここ

1