Перейти из форума на сайт.

НовостиФайловые архивы
ПоискАктивные темыТоп лист
ПравилаКто в on-line?
Вход Забыли пароль? Первый раз на этом сайте? Регистрация
Компьютерный форум Ru.Board » Интернет » Web-программирование » zip addFile в PHP7

Модерирует : Cheery

 Версия для печати • ПодписатьсяДобавить в закладки

Открыть новую тему     Написать ответ в эту тему

oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
есть скрипт, причём пока была версия php 5, всё работало, переставил на php 7 и работать перестало.

Код:
 
error_reporting(E_ALL);
$pathdir='zip/'; // путь к папке, файлы которой будем архивировать
$nameArhive2 = "архив года.zip";
$nameArhive3 = iconv ('UTF-8', 'CP866', $nameArhive2);
 
$nameArhive="test.zip";
echo $nameArhive;
unlink($nameArhive); // удаляем zip файл если он существует
$zip = new ZipArchive; // класс для работы с архивами
if ($zip -> open($nameArhive, ZipArchive::CREATE) === TRUE){ // создаем архив, если все прошло удачно продолжаем
    $dir = opendir($pathdir); // открываем папку с файлами
    $zip->addEmptyDir($nameArhive2);
    while( $file = readdir($dir)){ // перебираем все файлы из нашей папки
                if (is_file($pathdir.$file)){ // проверяем файл ли мы взяли из папки
                $dd = iconv ("CP1251", "UTF-8", $file);
                $d = iconv('CP1251', 'CP866', $file);
                //$ddd=$nameArhive3."/".$d;
                $zip -> addFromString('string.txt', 'Это строка, которая будет записана в файл string.txt, а сам файл помещен в архив');  
                $zip -> addFile($pathdir.$d, $nameArhive3."/".$d); // и архивируем                    
                echo("Заархивирован: " .$pathdir.$dd) , '<br/>';                
            }
    }
    $zip -> close(); // закрываем архив.
    echo 'Архив успешно создан';
    
    $dir = opendir($pathdir); // открываем папку с файлами
    while( $file = readdir($dir)){ // перебираем все файлы из нашей папки
            if (is_file($pathdir.$file)){ // проверяем файл ли мы взяли из папки    
                //unlink($pathdir.$file); // удаляем
            }
    }
    
/*    if(file_exists($nameArhive))
    {
    // отдаём файл на скачивание
//    header('Content-type: application/zip');
//    header('Content-Disposition: attachment; filename="'.$nameArhive.'"');
    header("location:".$nameArhive);
    readfile($nameArhive2);
    // удаляем zip файл если он существует
    //unlink($nameArhive);
    }
*/    
}
else{
    die ('Произошла ошибка при создании архива');
}
 

 
архив создаётся, всё хорошо, для примера добавил $zip -> addFromString и это тоже работает, а вот файлы перестали добавляться из папки.
$zip -> addFile не работает или что-то ей мешает.
Уж скачал php_zip.dll , но и это не помогло.

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 09:44 02-11-2016 | Исправлено: oldVsevolod, 09:45 02-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod
зачем столько перекодирований?
Цитата:
                $dd = iconv ("CP1251", "UTF-8", $file);  
                $d = iconv('CP1251', 'CP866', $file);  

сделайте проверку, может ли скрипт читать файл перед добавлением. именно с перекодированным вариантом.
плюс, если файлы большие, может не хватать памяти.
ну и проверьте отображение ошибок

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 09:48 02-11-2016 | Исправлено: Mavrikii, 09:49 02-11-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
и доступ к фалу есть и ошибок нет (первая строчка для этого и написана)
А вот с памятью не знаю чего делать. Файлы порядка килобайта, их самих штук 150. Может надо чего-то php.ini поменять?
 
Да и кодировки можно убрать, и без них должно работать, только абракадабра будет, а не кириллица. Так что не в ней дело.

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 09:56 02-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod

Цитата:
ошибок нет (первая строчка для этого и написана)  

создайте и проверьте, что выводит.
 

Цитата:
и доступ к фалу есть

с перекодированным именем? я не говорю о
Цитата:
if (is_file($pathdir.$file))

 

Цитата:
Может надо чего-то php.ini поменять?  

если бы памяти не хватало - скрипт выдал бы ошибку и ззавершился.
 

Цитата:
Так что не в ней дело.

не факт, php7 с уникодом лучше работает, смотря что и как у вас там система делает. я давно уже перестал скрипт под виндой писать - отвратительное занятие.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 09:59 02-11-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
создайте и проверьте, что выводит.  

только сам скрипт Точнее заархивировано ..... и так каждый файл
но в реалии не архивирует сами файлы
 

Цитата:
с перекодированным именем?

а файл test.zip как бы называется и что имеете ввиду?
 
у меня IIS с php7 теперь, так как используется домен, то пишу скрипты под виндой.  
я пытался в addFile помять

Код:
$nameArhive3."/".$d
просто на '222', чтобы уйти от кодировок и так же тишина

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 10:16 02-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod

Цитата:
только сам скрипт  

 
я имел в виду создайте ошибку и посмотрите, будет ли сообщение выведено.

Цитата:
$pathdir.$d

попробуйте обернуть в realpath, может там с путями что то не так, все же.
да и первый аргумент в addFile реальный файл нужен, зачем ему имя перекодируете?
это второй аргумент - как имя файла будет в архиве.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 10:20 02-11-2016 | Исправлено: Mavrikii, 10:21 02-11-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Код:
$zip -> addFile(realpath($pathdir.$file), '222');

ничего не поменяло
по
Код:
echo realpath($pathdir.$file);
путь вроде верный, обракадабра, конечно Т.к. скрипт под юникодом, а файл от виндуса
 

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 10:33 02-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod

Цитата:
Т.к. скрипт под юникодом, а файл от виндуса  

я все равно не понимаю зачем вы перекодируете, если тут
Цитата:
is_file($pathdir.$file)

нормально обращаетесь? зачем?? вы отдельно перекодируете для второго аргумента - то, как файл будет отображаться в архиве, но зачем первый аргумент то переделывать?
 
далее, не проверили вывод ошибок.
плюс попробуйте на одном файле, без цикла.
 
после добавления сделайте  
echo $zip->getStatusString();

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 10:36 02-11-2016 | Исправлено: Mavrikii, 10:39 02-11-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
я не понимаю, что я перекодирую, если написать $pathdir.$file она же не кодированная нигде, вроде
 
в папку zip запихнул файл test.php, и в архиве появился файл 222
 
Добавлено:
test.zipNo errorЗаархивирован: C:\inetpub\wwwroot\zip\rrr tt.txt
на все остальные с кириллицей  
Invalid argument

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 10:42 02-11-2016 | Исправлено: oldVsevolod, 10:53 02-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod

Цитата:
я не понимаю, что я перекодирую,


Цитата:
$zip -> addFile($pathdir.$d, $nameArhive3."/".$d);

выделенное включает перекодированное имя в $d, что не нужно.
 

Цитата:
в папку zip запихнул файл test.php, и в архиве появился файл 222

ну, теперь переименуйте проблемный файл как то (чтобы была только латинница в названии) и его попробуйте.
 
в крайнем случае, можете попробовать читать файл в переменную и добавлять через addFromString

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 10:47 02-11-2016 | Исправлено: Mavrikii, 10:49 02-11-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
выделенное включает перекодированное имя в $d, что не нужно.  

я же выше написал, что поменял уже на  
$zip -> addFile(realpath($pathdir.$file).......
 
латиницу берёт на ура
 
Добавлено:
Invalid argumentЗаархивирован: C:\inetpub\wwwroot\zip\&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; &#65533;&#65533; I &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; 2015-2016 &#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533;&#65533; &#65533;&#65533;&#65533;&#65533;.doc

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 10:50 02-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod

Цитата:
латиницу берёт на ура

значит, видимо, php7 работает с другой кодировкой
я бы вообще не рекомендовал называть файлы с чем то отличающимся от латиницы.
 
попробуйте самостоятельно прочитать в переменную (file_get_contents), чтобы посмотреть что будет

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 10:54 02-11-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору

Цитата:
file_get_contents

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

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 11:06 02-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod

Цитата:
всё из файла читается

ну так читайте в переменную и addFromString.
название файла в архиве определяется вторым аргументом, его да, нужно перекодировать в правильную кодировку.
кстати - http://stackoverflow.com/questions/37138463/php7-utf-8-filenames-on-windows-server-new-phenomenon-caused-by-ziparchive
там, правда, речь о доступе к файлу созданного архиватором. но сдается мне, что проблема аналогичная.

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 11:09 02-11-2016 | Исправлено: Mavrikii, 11:11 02-11-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Хе-хе, работает
$zip -> addFromString($nameArhive3."/".$d, file_get_contents($pathdir.$file));
Спасибо

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 11:11 02-11-2016
Mavrikii

Platinum Member
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
oldVsevolod

Цитата:
Хе-хе, работает  

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

Всего записей: 15040 | Зарегистр. 20-09-2014 | Отправлено: 11:13 02-11-2016
oldVsevolod



BANNED
Редактировать | Профиль | Сообщение | Цитировать | Сообщить модератору
Но php7 по умолчанию работает в UTF, у меня все файлы UTF и такое недопонимание. В инете тоже никто пока не жалуется на кириллицу в 7 версии.
 
Файлы маленькие, обрабатывается всё быстро.

Всего записей: 264 | Зарегистр. 10-11-2015 | Отправлено: 11:19 02-11-2016
Открыть новую тему     Написать ответ в эту тему

Компьютерный форум Ru.Board » Интернет » Web-программирование » zip addFile в PHP7


Реклама на форуме Ru.Board.

Powered by Ikonboard "v2.1.7b" © 2000 Ikonboard.com
Modified by Ru.B0ard
© Ru.B0ard 2000-2024

BitCoin: 1NGG1chHtUvrtEqjeerQCKDMUi6S6CG4iC

Рейтинг.ru