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

Кемеровские программисты php общаются здесь
Ответить
Anonymous
 Мой .zip-архив, созданный с помощью PHP ZipArchive, поврежден/недействителен в Windows 10.

Сообщение Anonymous »

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

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

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

Windows не может завершить извлечение.

Сжатая (заархивированная) папка {filepath} недействительна.

Я использовал echo 'Zip-архив содержит ',$zip->numFiles' файлы со статусом ',$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 он по-прежнему поврежден.

Подробнее здесь: https://stackoverflow.com/questions/655 ... windows-10
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «Php»