Я создаю интерфейс, который позволяет собирать PDF-файлы с пути к серверу, чтобы загружать их в сжатом виде одновременно, что прекрасно работает большую часть времени. Теперь некоторые PDF-файлы не работают, это означает, что если в zip-файле содержится один из нерабочих файлов, загрузка не будет выполнена полностью.
Сейчас я попробовал много файлы с разными размерами. Я могу сказать, что большинство файлов размером более 10 МБ не работают, но работает один файл (15 МБ), поэтому размер файла не может быть причиной этой ошибки — верно?
Что происходит, просто нет загрузки вообще. Дополнительно попробовал прочитать результаты «$ zip-> addFile» и «$ zip-> close», но это все верно, даже если загрузка не будет выполнена. ЛЮБЫЕ идеи, которые могут вызвать эту ошибку, или хотя бы некоторые подсказки, как это выяснить?
(X) Проверка отладки переменных во время процесса не отличается между временем, когда он работал, и временем, когда он не работал. Разница только в размерах файлов и -paths.
Вот код, который я использую для создания ZIP:
public function downloadFiles() {
$myFiles = $this->Session->read('Files.MyFiles');
if(count($myFiles)) {
// build zip
$zipname = 'amaz_photos_' . time() . '.zip';
$zip = new ZipArchive();
$zip->open($zipname, ZipArchive::CREATE);
foreach($myFiles as $file) {
if($file['type'] == 'directory') {
$dirName = str_replace('/', '', substr($file['path'], strrpos($file['path'], '/'), (strlen($file['path']) - strrpos($file['path'], '/'))));
$zip->addEmptyDir($dirName);
$this->addFolderToZip($file['path'] . '/', $zip, $dirName . '/');
} else {
$zip->addFile($file['path'], str_replace('/', '', substr($file['path'], strrpos($file['path'], '/'), (strlen($file['path']) - strrpos($file['path'], '/')))));
}
}
$zip->close();
// get(send) zip
header('Content-Type: application/zip');
header('Content-disposition: attachment; filename=' . $zipname);
header('Content-Length: ' . filesize($zipname));
readfile($zipname);
ignore_user_abort(true);
unlink($zipname);
}
// clear "myFiles"//$this->Session->write('Files.MyFiles', array());
$this->redirect(array(
'controller' => 'pages',
'action' => 'display'
));
}
В конце концов, я попытался открыть поврежденные файлы с помощью нескольких PDF-ридеров, включая оригинал Adobe, чтобы определить, не поврежден ли он, но, похоже, нет.
Это происходит в открываемых zip-файлах, но загрузка все равно не начинается. Я обнаружил, что в тех особых случаях, когда загрузка не начинается, на сетевом фрейме не устанавливается заголовок ответа («application / zip») по сравнению со временем, когда он работал.
Что я узнал еще:
Допустим, у меня есть папка с 20 файлами, которая не загружается. Я попытался выбрать файл 1-10: загрузка, затем я попытался загрузить файл 11-20: загрузка, затем я попытался загрузить файл 1-20: не загрузка, затем я попытался два раза смешать шаблоны, сначала четные файлы 2,4 , 6,8 .. (1-20), после этого нечетные файлы 1,3,5,7, .. (1-20): каждый не загружается.
Это утверждает тошибка не относится к конкретному файлу.
Любые предложения, как определить триггер для этой ошибки?
Обновить:
Мне удалось скачать сгенерированный zip-файл, выполнив следующие действия:
Триггер ‘создать & скачать zip-файл ‘
Создает zip-файл, но не скачивает его
Введите сгенерированное имя файла zip-файлов в коде, чтобы загрузить его в следующей процедуре (например, «$ zipname =» generateOnStep1.zip «).
- Триггер ‘создать & скачать zip-файл снова
- Он не загружает (недавно) сгенерированный файл, но файл, который я сгенерировал на шаге 1. Таким образом, кажется, что: Генерация Zip-файлов работает И загрузка того же самого Zip-файла работает, но не сразу, а только в некоторых неизвестных комбинации.
…
Обновление 2:
Так как я не смог ни определить проблему, ни исправить ее, я закончил переработку всего процесса, чтобы перенаправить его на сгенерированный zip-файл вместо его «readfile». Некоторые функции должны были быть получены, но в любом случае это работает таким образом.
Попробуйте это … Удалить readfile($zipname);
и замените его следующими:
/* make sure no other functions
holding this file */
$filehandle = fopen($zipname, "r");
while (!feof($filehandle)) {
/* lets read the file by pieces and
send it to user's browser */
echo fread($filehandle, 8192);
}
fclose($filehandle);
Надеюсь это поможет.
Других решений пока нет …