Форумы портала PHP.SU » » Работа с файловой системой и файлами » Архивация директории

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

1. Laroux - 19 Ноября, 2013 - 13:30:45 - перейти к сообщению
Задача довольно простая: есть на хостинге много каталогов с 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) придется делать еще один клик мышкой по полученной ссылке на архив. А хотелось бы по одному клику сразу скачать...

Подскажите, плиз
2. dXdYdZ - 22 Ноября, 2013 - 23:01:06 - перейти к сообщению
Здравствуйте. Навскидку, всё можно сделать вот как:
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-заголовки, сообщающие браузеру, что мы отдаём пользователю файл. У пользователя в этот момент открывается окно скачивания файла. После выдачи заголовков мы отправляем сам файл. Затем мы этот файл удаляем.
3. Laroux - 13 Декабря, 2013 - 14:58:17 - перейти к сообщению
dXdYdZ, огромное тебе человеческое "спасибо" (карма не позволяет нажать кнопку "спасибо")
4. DanJake - 15 Сентября, 2015 - 21:23:06 - перейти к сообщению
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 />
не подскажите, с чем это связанно ?
5. Viper - 16 Сентября, 2015 - 09:32:39 - перейти к сообщению
DanJake пишет:
не подскажите, с чем это связанно ?
а глянуть что по этим строкам в этом файле?
6. DeepVarvar - 16 Сентября, 2015 - 10:26:12 - перейти к сообщению
Выкинь этот велосипед с пятью квадратными колесами.
Ответ на твой вопрос -- rsync.
7. DanJake - 16 Сентября, 2015 - 22:43:18 - перейти к сообщению
Viper пишет:
DanJake пишет:
не подскажите, с чем это связанно ?
а глянуть что по этим строкам в этом файле?

в когда, котоырй выше, это 19 и 23 строка, ругается на фалсайз и анлинк, я так понял, оно не находит архив
8. Viper - 17 Сентября, 2015 - 10:06:08 - перейти к сообщению
DanJake скорее всего неправильный путь к файлу.
9. DanJake - 17 Сентября, 2015 - 16:40:22 - перейти к сообщению
Viper пишет:
DanJake скорее всего неправильный путь к файлу.


к файлу, который я архивирую или к самому архиву?
10. Viper - 17 Сентября, 2015 - 20:38:35 - перейти к сообщению
Путь к архиву.
11. 450142079 - 02 Мая, 2016 - 15:52:07 - перейти к сообщению
Зарегался, только для того, чтоб выложить данный код.
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.  

 

Powered by ExBB FM 1.0 RC1