PHP.SU

Программирование на PHP, MySQL и другие веб-технологии
PHP.SU Портал     На главную страницу форума Главная     Помощь Помощь     Поиск Поиск     Поиск Яндекс Поиск Яндекс     Вакансии  Пользователи Пользователи

Страниц (1): [1]

> Найдено сообщений: 6
ZYM Отправлено: 15 Января, 2010 - 01:43:04 • Тема: Очень интересный вопрос по ООП • Форум: Программирование на PHP

Ответов: 10
Просмотров: 592
Ну да, всё правильно, поля класса - это константы его экземпляров. Имеет смысл выносить в константы все статичные данные, что идентичны и повторяется более 1 раза в коде =) на сколько я помню. Тем более, если они используются в методах класса.
ZYM Отправлено: 14 Января, 2010 - 17:07:44 • Тема: Проблемы разархивирования ZIP с кирилическими filename • Форум: Программирование на PHP

Ответов: 11
Просмотров: 2192
Всё, проблема решилась как только я полез смотреть заголовок! =)

В заголовке стоит PK, но прежде идет закомментированный кусок SQL кода в тегах <!-- ... -->, по которому, по всей видимости, был сформирован документ. Первое что пришло в голову - прочитать содержимое в переменную, найти strpos по "-->" и сделать substr.

Сработало!!! Теперь проблема русского имени. Решается с помощью PclZip 2.8.2 - в новой версии есть возможность написать обработчик по событию разархивирования очередного файла. Там-то я и меняю имя файла на нормальное =)

Для истории, вот обработчик:

CODE (text):
скопировать код в буфер обмена
  1.   function myPreExtractCallBack($p_event, &$p_header)
  2.   {
  3.  
  4.     $info = pathinfo($p_header['filename']);
  5.     if ($info['extension'] == 'xls') {
  6.       $p_header['filename'] = $info['dirname'].'/price.xls';
  7.       return 1;
  8.     } else {
  9.       return 0;
  10.     }
  11.  
  12.   }
  13.  
  14.  
  15.    $zip = new PclZip("arch.zip");
  16.    $list = $zip->extract(PCLZIP_OPT_PATH, 'extract', PCLZIP_CB_PRE_EXTRACT, 'myPreExtractCallBack');


Всем спасибо за участие!!!
ZYM Отправлено: 14 Января, 2010 - 15:16:58 • Тема: Проблемы разархивирования ZIP с кирилическими filename • Форум: Программирование на PHP

Ответов: 11
Просмотров: 2192
2JustUserR: PclZip при попытке вывода содержимого архива ругается PCLZIP_ERR_BAD_FORMAT (-10) : Invalid archive structure

Если разархивировать винраром и заархивировать им же, то всё замечательно работает! Значит вопрос в нехватке памяти отпадает, по всей видимости действительно архив в другом формате который не поддерживается

2alpha_beta:
- Исходный файл открывается винраром.
- Перепакованый винраром архив открывается и ZipArchive(), и PclZip..
- Исходный файл не открывается ни ZipArchive(), ни PclZip..

Всё это говорит о том, что изначально документ заархивирован чем-то другим, соответствующим требованиям zip, но не поддерживающимся ни ZipArchive(), ни PclZip. Что это может быть за...? Чем еще можно так криво заархивировать?
ZYM Отправлено: 14 Января, 2010 - 01:48:39 • Тема: Проблемы разархивирования ZIP с кирилическими filename • Форум: Программирование на PHP

Ответов: 11
Просмотров: 2192
shared_memory - я чего-то такого параметра не нахожу.. Может быть речь о memory_limit? Я ему присвоил 250M

PclZip дает возможность менять имя файла при разархивировании!

CODE (text):
скопировать код в буфер обмена
  1.   function myPreExtractCallBack($p_event, &$p_header)
  2.   {
  3.     $info = pathinfo($p_header['filename']);
  4.     if ($info['extension'] == 'xls') {
  5.       $p_header['filename'] = 'my-output-file';
  6.       return 1;
  7.     } else {
  8.       return 0;
  9.     }
  10.   }
  11.  
  12.    $list = $archive->extract(PCLZIP_OPT_PATH, 'output', PCLZIP_CB_PRE_EXTRACT, 'myPreExtractCallBack');


..казадлсь бы то что нужно! Но PclZip у меня вообще ничего не хочет разархивировать почему-то. А про нужный мне архив вообще пишет PCLZIP_ERR_BAD_FORMAT (-10) : Invalid archive structure

Тем не менее, виндовый архиватор никаких ошибок не видит и всё нормально вытаскивает.

Мистика.
ZYM Отправлено: 13 Января, 2010 - 23:47:12 • Тема: Проблемы разархивирования ZIP с кирилическими filename • Форум: Программирование на PHP

Ответов: 11
Просмотров: 2192
Делаю всё это на линуксовой машине.

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

Не понятно почему не удается открыть поток по имени..

CODE (text):
скопировать код в буфер обмена
  1. $fn=$zip->getNameIndex(0);
  2. $fp = $zip->getStream($fn);
  3. if (!$fp)
  4. {
  5.         echo 'failed open stream....';
  6. }


...по идее, какая ему разница на длинну файла?


И вот тут я начал задумываться об ограничениях на используемую память в PHP. В php.ini поставил 256Мб лимит на использование ОЗУ для скриптов и переменную output_buffering с 4096 увеличил до 8192. Результат тот же, к сожалению...


Библиотека Pclzip тоде не может разархивировать.

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

Пока пытаюсь "испортить" Pclzip в этом направлении.
ZYM Отправлено: 13 Января, 2010 - 15:16:35 • Тема: Проблемы разархивирования ZIP с кирилическими filename • Форум: Программирование на PHP

Ответов: 11
Просмотров: 2192
Всем привет!

Такая проблема - архив содержит файл с русскими буквами в имени и я никак не могу его разархиваровать. Дело скорее всего в размере файла - это XLS документ размером 4Мб. Получаю я его автоматически, т.е. на этапе архивирования переименовать не могу.

CODE (text):
скопировать код в буфер обмена
  1. $zip = new ZipArchive;
  2. $res = $zip->open('arch.zip');
  3. $zip->extractTo('folder');
  4. ...


Пробую переименовать вложеный файл,

CODE (text):
скопировать код в буфер обмена
  1. if ($zip->renameIndex(0, 'english.xls'))


не получается - в папке с файлом возникает 5 временных файлов размером 0, т.е. на сколько я понимаю это пять попыток выполнения функции с отказами...

...что же делать в данной ситуации?

пробовал получить имя файла по индексу 0 и по этому имени открыть поток

CODE (text):
скопировать код в буфер обмена
  1. $fn=$zip->getNameIndex(0);
  2. $fp = $zip->getStream($fn);
  3. if (!$fp)
  4. {
  5.         echo 'failed open stream....';
  6. }


не открывается...

CODE (text):
скопировать код в буфер обмена
  1. $fn=$zip->getNameIndex(0);
  2. $fn = iconv('cp866', 'windows-1251', $fn);
  3. $fp = $zip->getStream($fn);
  4. if (!$fp)
  5. {
  6.         echo 'failed open stream....';
  7. }


и так тоже не открывается...

CODE (text):
скопировать код в буфер обмена
  1. $fp = fopen("zip://url.ru/tmp/arch.zip#$fn", 'r');
  2. if (!$fp) {
  3.     exit("cannot open..........");
  4. }


и так тоже не открывается...

ну и через exec unzip разумеется тоже файл не создается (хотя и пишется, что операция прошла успешно)


...есть какой-нибудь выход?

Страниц (1): [1]
Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB