При создании zip-файла с помощью php я получаю два файла вместо одного

Я борюсь с простой функциональностью PHP: создание ZIP-архива с некоторыми файлами в.

Проблема в том, что он создает не только один файл с именем filename.zip, но два файла с именами filename.zip.a07600 и filename.zip.b07600. Pls. смотрите следующий скриншот:

без комментариев, просто посмотрите ...

Два файла имеют идеальный размер, и я даже могу переименовать каждый из них в filename.zip и извлечь его без проблем.

Кто-нибудь может сказать мне, что идет не так ???

function zipFilesAndDownload_Defect($archive_file_name, $archiveDir, $file_path = array(), $files_array = array()) {
// Archive File Name
$archive_file = $archiveDir."/".$archive_file_name;
// Time-to-live
$archiveTTL = 86400; // 1 day
// Delete old zip file
@unlink($archive_file);
// Create the object
$zip = new ZipArchive();
// Create the file and throw the error if unsuccessful
if ($zip->open($archive_file, ZIPARCHIVE::CREATE) !== TRUE) {
$response->res = "Cannot open '$archive_file'";
return $response;
}
// Add each file of $file_name array to archive
$i = 0;
foreach($files_array as $value){
$expl = explode("/", $value);
$file = $expl[(count($expl)-1)];
$path_file = $file_path[$i] . "/" . $file;
$size = round((filesize ($path_file) / 1024), 0);
if(file_exists($path_file)){
$zip->addFile($path_file, $file);
}
$i++;
}
$zip->close();
// Then send the headers to redirect to the ZIP file
header("HTTP/1.1 303 See Other"); // 303 is technically correct for this type of redirect
header("Location: $archive_file");
exit;
}

Код, который вызывает функцию, представляет собой файл с регистром-переключателем … он вызывается при помощи ajax-вызова:

case "zdl":
$files_array = array();
$file_path = array();
foreach ($dbh->query("select GUID, DIRECTORY, BASENAME, ELEMENTID from SMDMS where ELEMENTID = ".$osguid." and PROJECTID = ".$osproject.";") as $subrow) {
$archive_file_name = $subrow['ELEMENTID'].".zip";
$archiveDir = "../".$subrow['DIRECTORY'];
$files_array[] = $archiveDir.DIR_SEPARATOR.$subrow['BASENAME'];
$file_path[] = $archiveDir;
}
zipFilesAndDownload_Defect($archive_file_name, $archiveDir, $file_path, $files_array);
break;

Еще один код … Я попытался переименовать последний файл 123456.zip.a01234 в 123456.zip, а затем отсоединить старый 123456.zip.a01234 (и все ранее добавленные файлы .a01234) с помощью этой функции:

function zip_file_exists($pathfile){
$arr = array();
$dir = dirname($pathfile);
$renamed = 0;
foreach(glob($pathfile.'.*') as $file) {
$path_parts = pathinfo($file);
$dirname = $path_parts['dirname'];
$basename = $path_parts['basename'];
$extension = $path_parts['extension'];
$filename = $path_parts['filename'];
if($renamed == 0){
$old_name = $file;
$new_name = str_replace(".".$extension, "", $file);
@copy($old_name, $new_name);
@unlink($old_name);
$renamed = 1;
//file_put_contents($dir."/test.txt", "old_name: ".$old_name." - new_name: ".$new_name." - dirname: ".$dirname." - basename: ".$basename." - extension: ".$extension." - filename: ".$filename." - test: ".$test);
}else{
@unlink($file);
}
}
}

Короче говоря: копирование работает, переименование не работает и «отсоединение» — не работает вообще … У меня нет идей … 🙁

ЕЩЕ ОДИН РАЗ: Я поместил вывод переменной $ zip-> getStatusString () в переменную и записал ее в файл журнала … Полученная запись журнала: Не удалось переименовать временный файл: нет такого файла или каталога.
Но, как вы можете видеть на рисунке выше, файл 43051221.zip.a07200 находится в каталоге, где zip-lib его временно открывает.

Заранее спасибо за вашу помощь!

2

Решение

Итак, после нескольких дней борьбы … Это было так просто:

На самом деле я работаю ТОЛЬКО на * nix серверах, поэтому в своих скриптах я динамически создавал папки с 0777 Perms. Я не знал, что IIS вообще не принимает этот формат разрешений!

Поэтому я переместился на сервер, щелкнув правой кнопкой мыши на папке Documents (иерархически самая верхняя папка из всех динамически добавляемых файлов и папок) и дал полный контроль всем пользователям, которых я нашел.

Теперь это работает отлично !!! Единственное, что было бы интересно сейчас: это опасно по какой-либо причине ???

Спасибо за ваши добрые ответы …

2

Другие решения

Я подозреваю, что ваш сценарий превысил тайм-аут сценария PHP. PHP zip создает временный файл для зашифрования, где имя файла — yourfilename.zip.some_random_number. Этот файл переименовывается в yourfilename.zip, когда файл zip закрыт. Если срок действия сценария истекает, он, вероятно, просто останется там.

Попробуйте уменьшить количество файлов для архивирования или увеличить время ожидания скрипта с помощью set_time_limit ()

http://php.net/manual/en/function.set-time-limit.php

0

По вопросам рекламы [email protected]