Архивация не открывает файл - Код ошибки: 19
У меня возникли проблемы с тем, что мой код может открыть zip-файл, который я загрузил и переместил в папку, zip-файл загружается нормально, и вы можете открыть его в любой Zip-программе, однако, когда я пытаюсь открыть его с помощью ZipArchive, чтобы извлечь данные, в которых он ошибается.
$path = "../"; // Upload directory
$count = 0;
foreach ($_FILES['files']['name'] as $f => $name) {
if(move_uploaded_file($_FILES["files"]["tmp_name"][$f], $path . $name))
$count++; // Number of successfully uploaded file
}
$kioskFile = $_FILES['files']['name'][0];
$kioskFile = explode(".", $kioskFile);
$kioskFile = $kioskFile[0];
$zipFile = "../" . $kioskFile . ".zip";
$zip = new ZipArchive;
$res = $zip->open($zipFile);
if ($res === true) {
$zip->extractTo("./");
$zip->close();
} else {
echo "Error Cannot Open Zip File - Error Code: ";
}
Когда я запускаю код, он показывает мне код ошибки 19
АРХИВИРОВАНИЕ::ER_NOZIP- 19
Это ошибка, которую я получаю, однако файл существует, и если я использую zip_open, он возвращает, что он может открыть zip файл.
Любая помощь была бы очень полезна
ПРАВКА1 Если я загружаю zip-файл, который я создаю вручную (с помощью zip-программы), то загрузка работает нормально. Однако, если я использую zip-файл, созданный ZipArchive, он мгновенно выдает ошибку 19.
ПРАВКА2 Теперь я добавил проверку, чтобы убедиться, что файл существует в нужном каталоге, а также напечатал местоположение, оба совпадают, однако все та же проблема. Ошибка 19
$path = "../"; // Upload directory
$count = 0;
foreach ($_FILES['files']['name'] as $f => $name) {
if(move_uploaded_file($_FILES["files"]["tmp_name"][$f], $path . $name))
$count++; // Number of successfully uploaded file
}
$kioskFile = $_FILES['files']['name'][0];
$kioskFile = explode(".", $kioskFile);
$kioskFile = $kioskFile[0];
$realpath = realpath("../");
$zipFile = $realpath . "\\" . $kioskFile . ".zip";
if (file_exists($zipFile)) {
$extract = zip_extract($zipFile, "../");
if ($extract === TRUE) {
} else {
echo "The file " . $zipFile . " cannot be opened";
}
} else {
echo "The file " . $zipFile . " does not exist";
die();
}
ОБНОВЛЕНИЕ 1 Поэтому я думаю, что я сузил его до этого фрагмента кода или сценария загрузки, который я использую для загрузки zip-файла из системы, если я оставлю zip в системе и использую тот же фрагмент кода, он отлично работает.
Вот мой код загрузки, возможно, я что-то пропустил в этом, что вызывает проблему.
$fileID = $_GET['id'];
$backupLoc = "backups/";
$sql = "SELECT * FROM backups WHERE id = '" . addslashes($fileID) . "' LIMIT 1";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$backupFile = $row['backupFile'];
$zipFile = $backupLoc . "/" . $backupFile . ".zip";
$zipSize = filesize($zipFile);
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="' . basename($zipFile). '"');
ob_end_flush();
readfile($zipFile);
exit;
die();
2 answers
Откройте архив с помощью текстового или шестнадцатеричного редактора и убедитесь, что у вас есть подпись "PK" в начале файла. Если у вас есть какой-либо HTML-код до этой подписи, это будет означать, что ваши буферы не очищаются или очищаются, когда их не должно быть, что означает, что PHP ZipArchive примет недопустимый архив.
Это был download.php файл, который вызвал проблему, вот решение. который должен был сделать ЧИСТКУ OB, а не промывку
///echo "<div style='padding: 50px;'>Please Wait .....</div>";
$fileID = $_GET['id'];
$backupLoc = "backups/";
$sql = "SELECT * FROM backups WHERE id = '" . addslashes($fileID) . "' LIMIT 1";
$res = mysql_query($sql);
$row = mysql_fetch_array($res);
$backupFile = $row['backupFile'];
$zipFile = $backupLoc . "/" . $backupFile . ".zip";
$zipSize = filesize($zipFile);
header('Content-type: application/zip');
header('Content-Disposition: attachment; filename="' . basename($zipFile). '"');
//ob_end_flush();
ob_end_clean();
readfile($zipFile);
exit;
die();