Воспользовался классом zip.lib.php. Пользователь выбирает файл прайса со своего компа, отсылает на сервак, сервак получает файл, пакует его в ЗИП и сохраняет в специальной папке. Вот код: Код (Text): if(isset($price)) { include_once("zip.php"); include_once("translit.php"); $zip=new zipfile(); $Price_file="price/"; $Price_file.=translit(basename($price)); if(copy($price, $Price_file)) { $fp=fopen($Price_file,"rb"); $zip->addFile(fread($fp,filesize($Price_file)),$Price_file,time()); fclose($fp); $price_href="price/".$_SESSION["id"]."-price".date("d.m.y").".zip"; $f=fopen("price/".$_SESSION["id"]."-price".date("d.m.y").".zip","w"); fwrite($f,$zip->file()); fclose($f); unlink($Price_file); $price_exists=true; } } код у меня то работает (появляется нужный арххив с файлом), то нет (файл передается скрипту но при fwrite($f,$zip->file()); файл не создается, зато при echo($zip->file()) выдает в окно зип нормально (что мне не нужно). Испытваю на денвере. Кстати, у меня на денвере при указании в теге form атрибута enctype="multipart/form-data почему-то файлы не передаются скрипту, поэтому на локальной версии приходится отказываться от массива $_FILES и функций move_uploaded_file(), is_uploaded_file()
Sleven PHP: $f=fopen("price/".$_SESSION["id"]."-price".date("d.m.y").".zip","w"); Убедись, что у тебя здесь генерируется корректное имя файла (и что папка существует, и все права есть), кроме того, для Windows нужно использовать режим записи "wb". *моргает* В смысле, а без атрибута enctype все работает?
да, без атрибута enctype файлы нормально передаются, но доступны только из простых переменных, т.е. не достать их через $_FILES.
папка существует, ОС - Windows, поставил wb, имя генерируется корректное (проверил)... не пашет... самое интерсное, что даже открыв файл: $f=fopen("price/".$_SESSION["id"]."-price".date("d.m.y").".zip","w"); то даже если я добавляю строчку после этого наподобие такой: fwrite($f,"11111111111"); - все равно файл не создается.
уточню - копирование файла copy($price, $Price_file) срабатывает и этот самый файл появляется. А вот в архив не хочет
Sleven Что-то я все больше и больше начинаюсь склоняться к мысли, что Денвер - зло Принимать файлы, отправленные на сервер "не по стандарту" неправильно, даже если у тебя это работает. Проверь значения настроек PHP upload_tmp_dir, upload_max_filesize и post_max_size. Попробуй закачивать файлы другим браузером. Поставь другую версию Денвера, если все так печально.
Dagdamor, в очередной раз не могу понять — откуда люди берут такие проблемы? У меню все работает... А ты fclose($f); точно делаешь??
Форма: Код (Text): ... <form action="edit_salon.php" method="POST"> <input type="file" name="price"> <input type="submit" value="Отправить"></form> ... edit_salon.php: Код (Text): ... if(isset($price)) { include_once("zip.php"); include_once("translit.php"); // простейшая функция транслитерации, написанная мною $zip=new zipfile(); $Price_file="price/"; // задаем папку, где хранятся все прайсы $Price_file.=translit(basename($price)); // дополняем оттранслитерованным названием файла if(copy($price, $Price_file)) { // копируем в папку "price" полученный файл $fp=fopen($Price_file,"rb"); // полученный файл открываем для чтения $zip->addFile(fread($fp,filesize($Price_file)),$Price_file,time()); // считываем полученный файл и добавляем в $zip fclose($fp); $price_href="price/".$_SESSION["id"]."-price".date("d.m.y").".zip"; // папка и название нового файла-архива $f=fopen($price_href,"wb"); // создаем новый файл-архив fwrite($f,$zip->file()); // и записываем в него все сжатые даные fclose($f); unlink($Price_file); // удаляем полученный ранее и скопированный файл, т.к. он больше не нужен (его копия добавлена в созданный архив) } } ... результат выполнения - никакого архива и в помине. Проверял получен ли файл и существует ли - да, есть, названия файлов - тоже правильно. Теперь если вместо: Код (Text): fwrite($f,$zip->file()); поставить: Код (Text): fwrite($f,"1111"); - все равно никакого файла. Если же вместо: Код (Text): $f=fopen($price_href,"wb"); fwrite($f,$zip->file()); fclose($f); поставить: Код (Text): echo($zip->file()); то тут же выскакивает окно сохранения файла.
кстати, да, через Opera у меня вообще нигде денвер не получает файлы а в ИЕ все пашет... хотя нет, вру - Opera передает файлы, только если вернуть на место enctype и массив $_FILES, а IE - с точностью до наоборот
только что проверил: 1) При наличии enctype="multipart/form-data" и коде: Код (Text): ... if(isset($price)) { include_once("zip.php"); include_once("translit.php"); // простейшая функция транслитерации, написанная мною $zip=new zipfile(); $Price_file="price/"; // задаем папку, где хранятся все прайсы $Price_file.=translit(basename($_FILES["price"]["name"])); // дополняем оттранслитерованным названием файла if(copy($_FILES["price"]["tmp_name"], $Price_file)) { // копируем в папку "price" полученный файл $fp=fopen($Price_file,"rb"); // полученный файл открываем для чтения $zip->addFile(fread($fp,filesize($Price_file)),$Price_file,time()); // считываем полученный файл и добавляем в $zip fclose($fp); $price_href="price/".$_SESSION["id"]."-price".date("d.m.y").".zip"; // папка и название нового файла-архива $f=fopen($price_href,"wb"); // создаем новый файл-архив fwrite($f,$zip->file()); // и записываем в него все сжатые даные fclose($f); unlink($Price_file); // удаляем полученный ранее и скопированный файл, т.к. он больше не нужен (его копия добавлена в созданный архив) } } ... опера заругалась на функции copy() - no such file, IE выполнил скрипт, но архива не создал 2) при отсутствии enctype и коде, указанным мною в предыдущих сообщениях - и Опера, и ИЕ выполнили скрипт, но архив не появился.
пардон господа, моя забитая всякой xpенью башка всему виной... Дело оказалось вот в чем: 1) Когда скрипт впервые получал файл с прайсом, он добавлял его в архив и оставлял путь в базе данных. 2) Когда выбиралось редактирование и закачка нового прайса, то скрипт первым делом создавал этот новый архив, с текущей датой в названии, а потом уже только смотрел в базе ссылу на старый прайс и удалял его, соответственно, если редактировать больше одного раза в день - тогда скрипт как только создавал новый архив, тут же удалял его (т.к. в базе был аналогичный путь к старому файлу). Проблема была решена перемещением этой части кода. Вот рабочий вариант: Код (Text): if(isset($price)) { // если переменная файла существует if(!strstr(basename($price),".rar") && !strstr(basename($price),".zip")) { // в "правильном" варианте $price надо заменить на $_FILES["price"]["name"] // если закачиваемый файл уже является архивом, то ZIP не потребуется include_once("translit.php"); include_once("zip.php"); $zip=new zipfile(); $Price_file=translit(basename($price)); // в "правильном" варианте $price надо заменить на $_FILES["price"]["name"] // транслитерируем русские буквы в названии файла if(copy($price, $Price_file)) { // в "правильном" варианте $price надо заменить на $_FILES["price"]["tmp_name"], // а функцию copy() лучше заменить на move_uploaded_file // копируем полученный файл в текущую директорию, с новым именем $fp=fopen($Price_file,"rb"); // открываем полученный (скопированный) файл для чтения $zip->addFile(fread($fp,filesize($Price_file)),$Price_file,time()); // добавляем данные файла в архив fclose($fp); $price_href=$_SESSION["id"]."-price".date("d.m.y").".zip"; // задаем имя создаваемого архива $f=fopen("price/".$price_href,"wb"); // создаем архив в нужной нам папке fwrite($f,$zip->file()); // записываем архив fclose($f); unlink($Price_file); // удаляем скопированный ранее файл, который теперь не нужен } } else { // если полученный файл уже является архивом, то второй раз сжимать не будем, а просто // скопируем его в нужную папку, задав новое имя $price_href=$_SESSION["id"]."-price".date("d.m.y").substr(basename($price),-4); // в "правильном" варианте $price надо заменить на $_FILES["price"]["name"] // задаем новое имя copy($price, "price/".$price_href); // копируем в нужную нам папку // в "правильном" варианте $price надо заменить на $_FILES["price"]["tmp_name"] } } Кстати, я использовал транслитерацию при добавлении файлов в архив, потому как не знаю в какую кодировку надо конвертить символы в данном случае. Пробовал в ЮТФ-8 - все равно иероглифы.