Мой zip-архив, созданный с помощью PHP ZipArchive, поврежден / недействителен в Windows 10

#php #windows-10 #zip #unzip #ziparchive

#php #windows-10 #zip #разархивируйте #ziparchive

Вопрос:

Я использую следующую функцию для создания резервной копии моей базы данных MySQL. Это отлично работает и генерирует .sql файл, содержащий все. Сам файл в последнее время составляет около 36 мегабайт. Я надеялся сжать файл в zip, чтобы сэкономить место на диске. Я могу создать .zip , и, похоже, он работает и создает .zip файл размером около 4,5 мегабайт. Однако я попытался загрузить zip-файл и открыть его в Windows 10, и я получил:

Эта папка пуста.

Когда я пытаюсь распаковать zip, даже если он пуст, я получаю:

Windows не может завершить извлечение.
Сжатая (архивированная) папка {путь к файлу} недопустима.

Я использовал echo 'The zip archive contains ',$zip->numFiles,' files with a status of ',$zip->status; , и это дает мне:

Zip-архив содержит 1 файл со статусом 0

Открытие zip-файла с помощью ZipArchive и сброс var результата дали мне:

 object(ZipArchive)[15]
  public 'status' => int 0
  public 'statusSys' => int 0
  public 'numFiles' => int 1
  public 'filename' => string '/backups/mysql/2021-01-01-0258-mysql_backup_1609491536.zip' (length=91)
  public 'comment' => string '' (length=0)
 

Что я делаю, что повреждает файл, который я не могу разархивировать или просмотреть файлы в Windows? Кажется, PHP может определить, что файл есть.

         function backup_tables($savepath,$tables = '*',$zip=true) {
            $savepath = rtrim($savepath,'/');
            $filepath = $savepath.'/';
            $name = date("Y-m-d-hi").'-mysql_backup_'.time();
            $fileName = $filepath.$name.'.sql';
            $zipName = $filepath.$name.'.zip';
            //$this->select("SET NAMES 'utf8'");
            
            exec('mysqldump --user='.escapeshellarg($this->user).' --password='.escapeshellarg($this->pass).' --host='.escapeshellarg($this->host).' '.escapeshellarg($this->db).' > '.escapeshellarg($fileName).'');
            if(file_exists($fileName)) {
            //if(fclose($handle)){
                if($zip==true) {
                    $zip = new ZipArchive();
                    if($zip->open($zipName,ZIPARCHIVE::CREATE) !== true) {
                        return false;
                    }
                    //add the files
                    
                    $zip->addFile($fileName);
                    //debug
                    //echo 'The zip archive contains ',$zip->numFiles,' files with a status of ',$zip->status;
                    //close the zip -- done!
                    $zip->close();
                    if(file_exists($zipName)) {
                        //unlink($fileName);
                    }
                    
                    
                    $za = new ZipArchive();
                    $za->open($zipName);
                    var_dump($za);
                    
                    /* All good for Zip but return nothing. */
                    return true;
                }
                else {
                    /* All good for .sql file but return nothing. */
                    return true;
                }
                exit; 
            }
            else {
                echo 'SQL file does not exists at: '.$fileName;
            }
        }
 

Обновить

Как указано в ответах, у меня было неправильное имя переменной при открытии файла. Теперь я получаю это на var_dump($za) .

  object(ZipArchive)[15]
    public 'status' => int 0
    public 'statusSys' => int 0
    public 'numFiles' => int 1
    public 'filename' => string '.../backups/mysql/2021-01-01-0313-mysql_backup_1609492418.zip' (length=91)
    public 'comment' => string '' (length=0)
 

Теперь в нем говорится, что в нем есть один файл; однако он все еще поврежден в Windows.

Ответ №1:

Вы открываете $fileName проверку, но вам придется открыть $zipName

Комментарии:

1. facepalm Я отредактирую и обновлю свой вопрос. Файл по-прежнему поврежден, когда я загружаю его в Windows.