Warning: Cannot use a scalar value as an array in /home/admin/public_html/forum/include/fm.class.php on line 757

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/include/fm.class.php on line 770

Warning: Invalid argument supplied for foreach() in /home/admin/public_html/forum/topic.php on line 737
Форумы портала PHP.SU :: Архивация директории

 PHP.SU

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


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

> Без описания
Laroux
Отправлено: 19 Ноября, 2013 - 13:30:45
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




Задача довольно простая: есть на хостинге много каталогов с n-ным количеством файлов (до 15 штук) каждый. Файлы с разными расширениями.
Время от времени мне надо брать все содержимое какого-нить одного такого каталога к себе на локальную машинку. Не могу сообразить, как бы мне забрать из каталога все одним файлом, но так, чтобы архив не сохранялся.

Создать сам архив - не проблема. Например:
PHP:
скопировать код в буфер обмена
  1. <?PHP
  2. $pathdir='test/'; // путь к папке, файлы которой будем архивировать
  3. $nameArhive = 'test.zip'; //название архива
  4. $zip = new ZipArchive; // класс для работы с архивами
  5. if ($zip -> open($nameArhive, ZipArchive::CREATE) === TRUE){ // создаем архив, если все прошло удачно продолжаем
  6.     $dir = opendir($pathdir); // открываем папку с файлами
  7.     while( $file = readdir($dir)){ // перебираем все файлы из нашей папки
  8.             if (is_file($pathdir.$file)){ // проверяем файл ли мы взяли из папки
  9.                 $zip -> addFile($pathdir.$file, $file); // и архивируем
  10.                 echo("Заархивирован: " . $pathdir.$file) , '<br/>';
  11.             }
  12.     }
  13.     $zip -> close(); // закрываем архив.
  14.     echo 'Архив успешно создан';
  15. }else{
  16.     die ('Произошла ошибка при создании архива');
  17. }
  18. ?>

однако при таком раскладе:
1) архив останется где-то там на хостинге. А как бы не надо;
2) придется делать еще один клик мышкой по полученной ссылке на архив. А хотелось бы по одному клику сразу скачать...

Подскажите, плиз
 
 Top
dXdYdZ
Отправлено: 22 Ноября, 2013 - 23:01:06
Post Id


Посетитель


Покинул форум
Сообщений всего: 271
Дата рег-ции: Нояб. 2013  


Помог: 11 раз(а)




Здравствуйте. Навскидку, всё можно сделать вот как:
PHP:
скопировать код в буфер обмена
  1.  
  2. $pathdir='test/'; // путь к папке, файлы которой будем архивировать
  3. $nameArhive = 'test.zip'; //название архива
  4. $zip = new ZipArchive; // класс для работы с архивами
  5. if ($zip -> open($nameArhive, ZipArchive::CREATE) === TRUE){ // создаем архив, если все прошло удачно продолжаем
  6.     $dir = opendir($pathdir); // открываем папку с файлами
  7.     while( $file = readdir($dir)){ // перебираем все файлы из нашей папки
  8.             if (is_file($pathdir.$file)){ // проверяем файл ли мы взяли из папки
  9.                 $zip -> addFile($pathdir.$file, $file); // и архивируем
  10.                 //echo("Заархивирован: " . $pathdir.$file) , '<br/>';
  11.             }
  12.     }
  13.     $zip -> close(); // закрываем архив.
  14.     //echo 'Архив успешно создан';
  15.  
  16. //Высылаем пользователю архив
  17. header ("Content-Type: application/octet-stream");
  18. header ("Accept-Ranges: bytes");
  19. header ("Content-Length: ".filesize($nameArhive));
  20. header ("Content-Disposition: attachment; filename=".$nameArhive);  
  21. readfile($filepath);
  22. //Удаляем файл
  23. unlink($nameArhive);
  24.  
  25. }else{
  26.     die ('Произошла ошибка при создании архива');
  27. }
  28.  


То есть после архивации мы высылаем HTTP-заголовки, сообщающие браузеру, что мы отдаём пользователю файл. У пользователя в этот момент открывается окно скачивания файла. После выдачи заголовков мы отправляем сам файл. Затем мы этот файл удаляем.

(Отредактировано автором: 22 Ноября, 2013 - 23:03:08)

 
 Top
Laroux
Отправлено: 13 Декабря, 2013 - 14:58:17
Post Id


Новичок


Покинул форум
Сообщений всего: 2
Дата рег-ции: Нояб. 2013  


Помог: 0 раз(а)




dXdYdZ, огромное тебе человеческое "спасибо" (карма не позволяет нажать кнопку "спасибо")
 
 Top
DanJake
Отправлено: 15 Сентября, 2015 - 21:23:06
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




dXdYdZ пишет:
Здравствуйте. Навскидку, всё можно сделать вот как:
PHP:
скопировать код в буфер обмена
  1.  
  2. $pathdir='test/'; // путь к папке, файлы которой будем архивировать
  3. $nameArhive = 'test.zip'; //название архива
  4. $zip = new ZipArchive; // класс для работы с архивами
  5. if ($zip -> open($nameArhive, ZipArchive::CREATE) === TRUE){ // создаем архив, если все прошло удачно продолжаем
  6.     $dir = opendir($pathdir); // открываем папку с файлами
  7.     while( $file = readdir($dir)){ // перебираем все файлы из нашей папки
  8.             if (is_file($pathdir.$file)){ // проверяем файл ли мы взяли из папки
  9.                 $zip -> addFile($pathdir.$file, $file); // и архивируем
  10.                 //echo("Заархивирован: " . $pathdir.$file) , '<br/>';
  11.             }
  12.     }
  13.     $zip -> close(); // закрываем архив.
  14.     //echo 'Архив успешно создан';
  15.  
  16. //Высылаем пользователю архив
  17. header ("Content-Type: application/octet-stream");
  18. header ("Accept-Ranges: bytes");
  19. header ("Content-Length: ".filesize($nameArhive));
  20. header ("Content-Disposition: attachment; filename=".$nameArhive);  
  21. readfile($filepath);
  22. //Удаляем файл
  23. unlink($nameArhive);
  24.  
  25. }else{
  26.     die ('Произошла ошибка при создании архива');
  27. }
  28.  


То есть после архивации мы высылаем HTTP-заголовки, сообщающие браузеру, что мы отдаём пользователю файл. У пользователя в этот момент открывается окно скачивания файла. После выдачи заголовков мы отправляем сам файл. Затем мы этот файл удаляем.


Воспользовался вашим методом, но скачанный архив не открывается, если открыть в как текстовый файл его, там 2 варнинга
b>Warning</b>: filesize() [<a href='function.filesize'>function.filesize</a>]: stat failed for test.zip in <b>C:\apache\localhost\www\save_xml.php</b> on line <b>113</b><br />

<b>Warning</b>: unlink(test.zip) [<a href='function.unlink'>function.unlink</a>]: No such file or directory in <b>C:\apache\localhost\www\save_xml.php</b> on line <b>117</b><br />
не подскажите, с чем это связанно ?
 
 Top
Viper
Отправлено: 16 Сентября, 2015 - 09:32:39
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




DanJake пишет:
не подскажите, с чем это связанно ?
а глянуть что по этим строкам в этом файле?


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
DeepVarvar Супермодератор
Отправлено: 16 Сентября, 2015 - 10:26:12
Post Id



Активный участник


Покинул форум
Сообщений всего: 10377
Дата рег-ции: Дек. 2008  
Откуда: Альфа Центавра


Помог: 353 раз(а)




Выкинь этот велосипед с пятью квадратными колесами.
Ответ на твой вопрос -- rsync.
 
 Top
DanJake
Отправлено: 16 Сентября, 2015 - 22:43:18
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Viper пишет:
DanJake пишет:
не подскажите, с чем это связанно ?
а глянуть что по этим строкам в этом файле?

в когда, котоырй выше, это 19 и 23 строка, ругается на фалсайз и анлинк, я так понял, оно не находит архив
 
 Top
Viper
Отправлено: 17 Сентября, 2015 - 10:06:08
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




DanJake скорее всего неправильный путь к файлу.


-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
DanJake
Отправлено: 17 Сентября, 2015 - 16:40:22
Post Id


Новичок


Покинул форум
Сообщений всего: 6
Дата рег-ции: Авг. 2015  


Помог: 0 раз(а)




Viper пишет:
DanJake скорее всего неправильный путь к файлу.


к файлу, который я архивирую или к самому архиву?
 
 Top
Viper
Отправлено: 17 Сентября, 2015 - 20:38:35
Post Id



Активный участник


Покинул форум
Сообщений всего: 4555
Дата рег-ции: Февр. 2007  
Откуда: Симферополь


Помог: 98 раз(а)




Путь к архиву.

(Отредактировано автором: 17 Сентября, 2015 - 20:38:57)



-----
Список фильмов с описанием, блекджеком и... для Joomla? -> https://киноархив[dot]com
Демо нового движка для сайта php.su -> php[dot]su, проект на гитхабе
 
 Top
450142079
Отправлено: 02 Мая, 2016 - 15:52:07
Post Id



Новичок


Покинул форум
Сообщений всего: 1
Дата рег-ции: Май 2016  


Помог: 0 раз(а)




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


CODE (htmlphp):
скопировать код в буфер обмена
  1.  
  2. <?php
  3. $zz=array();/*массив для путей к файлам*/
  4. $not=array();/*массив для исключений*/
  5.  
  6. /*Название архива*/
  7. $ZipName='test.zip';
  8. /*Исключения*/
  9. $not[count($not)]=$ZipName;
  10. $not[count($not)]='io.php';
  11. $not[count($not)]='admin';
  12.  
  13. wfold('');/*С какой папки тащим*/
  14.  
  15.  
  16. function wfold($url){
  17.  
  18.         global $zz;/*добавляем массивы в функцию*/
  19.         global $not;
  20.  
  21.         $mm = glob($url ."*");/*в массив список, что в папке*/
  22.         for($i=0;$i<count($mm);$i++){/*Идем по всему массиву*/
  23.  
  24.                 $nn=0;/*Счетчик исключений*/
  25.                 for($i2=0;$i2<count($not);$i2++){/*Есть ли он в исключении?*/
  26.                         if($mm[$i] == $not[$i2]){$nn=1;}
  27.                 }
  28.                 if($nn==0){
  29.                         if(is_dir($mm[$i])){/*Если это папка*/
  30.                                 wfold($mm[$i] . '/');/*Рекурсивно запускаем эту же функцию*/
  31.                         }else{/*это файл*/
  32.                                 $zz[count($zz)]=$mm[$i];/*добавляем в массив*/
  33.                         }
  34.                 }
  35.  
  36.         }
  37. }
  38.  
  39. $zip=new ZipArchive();/*Подключаем библиотеку архива*/
  40. if($zip->open($ZipName, ZipArchive::CREATE)!==TRUE){/*Удачное ли создание*/
  41.         exit('CreateZIP[X]');
  42. }
  43. for($i=0;$i<count($zz);$i++){/*Из массива в архив*/
  44.         $zip->addFile($zz[$i]);
  45. }
  46. /*Показ размерности и закрытие*/
  47. echo $ZipName.'[FileKol=' . $zip->numFiles . ';FileSize=';
  48. $zip->close();
  49. echo (filesize($ZipName))/1000000 . 'mb;]';
  50.  
  51. ?>
  52.  
 
 Top
Страниц (1): [1]
Сейчас эту тему просматривают: 0 (гостей: 0, зарегистрированных: 0)
« Работа с файловой системой и файлами »


Все гости форума могут просматривать этот раздел.
Только зарегистрированные пользователи могут создавать новые темы в этом разделе.
Только зарегистрированные пользователи могут отвечать на сообщения в этом разделе.
 



Powered by PHP  Powered By MySQL  Powered by Nginx  Valid CSS  RSS

 
Powered by ExBB FM 1.0 RC1. InvisionExBB