Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Kompresja katalogu do gzip
Forum PHP.pl > Forum > PHP
DJSuperMEN
Witam smile.gif, to mój pierwszy post i mam nadzieję że nie zostane odrazu skarcony tongue.gif

Jak wiecie w internecie jest coraz wiecej cwaniaków, którzy lubią robić down load-y z adresami z innych serwerów, pobierając tym samym ich tranfer. Jest wiele metod aby temu zapobiegać, i właśnie zainteresowałem się tym tematem.

Chciałbym zrobić coś takiego smile.gif, a mianowicie:

Osoba wchodzi na strone i klika w download.php?id=cos_tam

teraz srypt download.php szuka katalogu o nazwie (w katalogu w którym są pliki) cos_tam i kompresuje go do formatu gzip, daje mu wygenerowaną nazwę a następnie wysyła headerem do przeglądarki, no i user pobiera sobie ładnie pliczek wytworzony automatycznie przez skrypt.

Najważniejszym priorytetem tutaj jest dla mnie skompresowanie katalogu cos_tam (potem jest łatwosc jezeli sie buga wykryje i wysyła sie odrazu pliczek na serwer, jako .php i nie trzeba zip-ków ani rar-ów robić).

Proszę Was o pomoc, dzięki z góry winksmiley.jpg

//OT:ON// PS. DLA OSOBY KTÓRA POLECI MI SKORZYSTAC Z JAKŻE POŻYTECZNEJ FUNKCJI SZUKAJ - INFORMACJA : szukałem i po wpisaniu gzip otrzymuje dwa nic nieznaczące wyniki//OT:OFF//
DJSuperMEN
Witam ponownie smile.gif

Zmonciłem coś takiego:
  1. <?php
  2.  
  3.  
  4. function compress( $srcFileName, $dstFileName )
  5. {
  6.  // getting file content
  7.  $fp = opendir( $srcFileName);
  8.  $file = readdir($fp);
  9.  closedir($fp);
  10.  
  11.  // writing compressed file
  12.  $file2 = gzopen( $dstFileName, &#092;"w9\" );
  13.  gzwrite( $file2, $file );
  14.  gzclose( $file2);
  15. }
  16.  
  17. compress ('katalog', 'plik.gz');
  18.  
  19. ?>


Teraz zapisuje mi katalog 'katalog' do pliku 'plik.gz' na serwerze.

Tylko mam 2 problemy z nim, a mianowicie:

1 - nie zapisuje zawartości katalogu, a jedynie tworzy pusty plik 'plik.gz'

2 - jak zrobić aby ten pilk nie zapisywał sie na dysku, ale odrazu był wysyłany do przeglądarki

Pomożecie, dzięki winksmiley.jpg
dasko
Eeh, to nie jest takie proste...

Gzip to algorytm kompresji, więc nie uda Ci się osiągnać jakiejkolwiek struktury katalogowej w pliku - do tego trzeba użyć jednego ze sposobów archiwizacji - najlepiej TAR(polecam), a potem dopiero plik TAR przelecieć Gzipem. Niestety archwizatora TAR nie wbudowano w php, więc albo sobie napiszesz do tego jakąś funkcje, albo poszukasz gotowej klasy - np. w PEAR.

Jeśli podejmiesz się napisania tego czegoś(nic trudnego, wystarczy znac strukture nagłówka pliku w TARze), to poszukaj sobie na google o formacie TAR(ja tak robiłem, polecam wikipedie), albo przepisz z PEARa winksmiley.jpg
DJSuperMEN
OK, wiec jezeli tak mówisz to musi byc prawda biggrin.gif

Znalazem klasę do obsługi "chyba" właśnie tego co napisałeś.

Znajduje się ona pod adresem:
http://cvs.sourceforge.net/viewcvs.py/xoop...tar.php?rev=1.4

Jako że jestem zielony w programoaniu obiektowym (jak i w obłudze klas) mógłby mi ktoś napisać czy:

1 - to dobra klasa właśnie do tego czego szukam
2- jak ją wykorzystać (polecenia napiszcie)

Jeszcze raz dziękuję za pomoc i czekam na odpowiedzi z niecierpliowścią smile.gif
nocnyMark()
DJu z mojej strony moge Ci zaproponowac gotowy skrypt, ktory mozna wykorzystywac na licencji GNU

http://www.phpconcept.net/pclzip/index.en.php

produkuje on pliki do zip'a

w readmie masz sposob jak go wykrzystac w calosci,

ja podam Ci tylko w skrocie jak go uzywam abys zobaczyl ze nie jest skomplikowany:

  1. <?php
  2. $filename = 'nazwa_pliku.zip';
  3.  
  4. $mime_type = (USER_BROWSER_AGENT == 'IE' || USER_BROWSER_AGENT == 'OPERA')
  5.  ? 'application/octetstream'
  6.  : 'application/octet-stream';
  7.  
  8. require_once('tools/pclzip.lib.php'); //tutaj podaje sciezke do pliku pclzip.lib.php
  9.  
  10. $archive = new PclZip('c:/www/archiwum/'.$filename); //tworze plik archiwum i wybieram katalog docelowy
  11.  
  12. //a tu podaje jakie katalogi ida do archiwum, i jakie sciezki usunac z archiwum
  13. $v_list = $archive->add('c:/www/'.$dystrybucja.'/,c:/mysql/data/'.$dystrybucja.'/', 
  14. PCLZIP_OPT_ADD_PATH, '',
  15. PCLZIP_OPT_REMOVE_PATH, 'c:/www/'.$dystrybucja.'/');
  16.  
  17. ?>
DJSuperMEN
Dzięki wielkie za pomoc. Wszystko działa.

Teraz to, co opracowałem niech posłuży potomnym, którzy pewnie też bedą mieli pobobny problem. Systemu nie idzie oszukac, to swietna metoda na bezpieczny, i dobry download smile.gif


plik download.php
  1. <?php
  2. $filename = uniqid(rand()).'.zip'; // nazwa pliku tworzona automatycznie
  3.  
  4. $mime_type = (USER_BROWSER_AGENT == 'IE' || USER_BROWSER_AGENT)'application/octetstream' : 'application/octet-stream';
  5.  
  6. require_once('pclzip.lib.php'); //tutaj podaje sciezke do pliku pclzip.lib.php
  7.  
  8. $archive = new PclZip('c:/WebServ/httpd/gzip/cache/'.$filename); //tworze plik archiwum i wybieram katalog docelowy
  9.  
  10. //a tu podaje jakie katalogi ida do archiwum, i jakie sciezki usunac z archiwum
  11. $v_list = $archive->add('c:/WebServ/httpd/gzip/katalog', PCLZIP_OPT_ADD_PATH, '', PCLZIP_OPT_REMOVE_PATH, 'c:/WebServ/httpd/gzip/katalog');
  12.  
  13. // tutaj wysyłam plik do przeglądarki
  14. header(&#092;"Content-type: application/octet-stream\");
  15. header(&#092;"Content-disposition: attachment; filename=houres3.zip\");
  16. readfile('cache/'.$filename.'');
  17.  
  18. // a na koncu go kasuje
  19. unlink('cache/'.$filename.'');
  20. ?>


Do kodu który napisałem trzeba utworzyc katalog cache o chmodzie 777.

Jeszcze raz dzięki za pomoc smile.gif, thanks for all
elessar
Powinienes jeszcze sprawdzac skad wywolywany jest skrypt.

Bo co jesli ktos u siebie w download da link: (...)download.php?id=cos_tam ?
DJSuperMEN
Cytat
Powinienes jeszcze sprawdzac skad wywolywany jest skrypt.

Bo co jesli ktos u siebie w download da link: (...)download.php?id=cos_tam ?


Może zanim cos napiszesz pomysl, to nie boli smile.gif

Tytuł tematu to Kompresja katalogu do gzip a nie robimy Download z DJ-em.
Ja sie wszystkiego co chciałem dowiedziałem, a ty jak czegos nie wiesz załóż nowy temat.

papa, biggrin.gif
mynio
witam,
może to Ci pomoże:
http://php5.pl/php/przesylanie_danych_z_wy..._kompresji_gzip

pzdr
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.