Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] pobieraczka :>
Forum PHP.pl > Forum > Przedszkole
Kao
Witam

Takie oto coś sobie wymodziłem:

  1. <?php
  2. //tylko liczby
  3.  $int_options = array("options"=>array("min_range"=>1, "max_range"=>10));
  4.  if (!($pliczek = filter_var(trim($_GET['id']),FILTER_VALIDATE_INT,$int_options))) die("Nie ma takiego pliku!");
  5.  
  6. // jakis katalog
  7.  $pliczki_dir = './245145/';    
  8.  
  9. // lista plikow ktore mozna pobrac
  10.  $pliczki_tab = array('','plik1.cdr','plik2.cdr');
  11.  
  12. // do jednej zmiennej  
  13.  $link_to_file = $pliczki_dir.$pliczki_tab[$pliczek];
  14.  
  15. // czy pliczek istnieje
  16.  if (@file_exists($link_to_file)) {
  17.      $str=file_get_contents($link_to_file);
  18. // czy to pusty plik    
  19.      if (strlen($str) == 0) {
  20.      die("Nie ma takiego pliku!");
  21.     } else {
  22. // plik ok - wysyłanie
  23.      header("Pragma: public");
  24.      header("Expires: 0");
  25.      header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  26.      header("Cache-Control: private",false);
  27.      header("Content-Description: File Transfer");
  28.      header("Content-Type: application/force-download");
  29.      header("Content-Disposition: attachment; filename=\"".$pliczki_tab[$pliczek]."\";");
  30.      header("Content-Transfer-Encoding: binary");
  31.      header("Content-Length: ".strlen($str));
  32.      echo($str);
  33.      exit;
  34.     }
  35.  } die("Nie ma takiego pliku!");
  36. ?>


I moje pytania brzmią:
1. Czy lepsze jest:
  1. <?php
  2. header("Content-Length: ".strlen($str));
  3. ?>

czy może lepiej:
  1. <?php
  2. header("Content-Length: ".filesize($link_to_file));
  3. ?>

2. Czy tak prosty download nie ma jakiś "ukrytych dziurek" ?

Z góry dziękuje za odpowiedź.
Pozdr.
KaO
erix
Cytat
czy może lepiej:

No skoro masz wczytany plik do pamięci, to po co jeszcze FS męczyć...? Ale z drugiej strony, strlen" title="Zobacz w manualu PHP" target="_manual, to jedna z najwolniejszych funkcji. Musiałbyś zrobić jakiś benchmark, aby sprawdzić.

  1. <?php
  2. if (strlen($str) == 0) {
  3. ?>

A nie wystarczy sprawdzić, czy zmienna == false" title="Zobacz w manualu PHP" target="_manual...? Przeczytaj nieco wyżej, co napisałem.

Cytat
2. Czy tak prosty download nie ma jakiś "ukrytych dziurek" ?

Z tego, co widzę, to nie. Ale czy nie lepiej byłoby obarczyć tym zadaniem mod_rewrite...? Nie masz żadnego zliczania, to po co tracić pamięć i czas?
Pilsener
Pobierasz cały plik do zmiennej i wysyłasz do przeglądarki - nie wydaje mi się to dobre, nie lepiej wysyłać plik linia po linii albo po kęsku, np. po 50 kb?

  1. <?php
  2. $down_rate = 1024*50;
  3. $file = fopen($plik, "r");
  4. while(!feof($file)){
  5.   echo fread($file,$down_rate);
  6. }
  7. fclose($file);
  8. ?>
- wykona się minimalnie wolniej, za to nie obciążysz w ogóle pamięci. Potem ciągłe prośby o zwiekszenie memory_limit, jak wrzucacie do zmiennych całe pliki.

Ja bym Ci jeszcze radził sprawdzić, czy działa ok w Internet Exploderze 6.0+
Kao
Witam
Lekko zmodyfikowałem/poprawiłem (po uwagach Waszych) i nic więcej nie będę modyfikował, bo nic nie jest doskonałe i zawsze będzie jakaś uwaga snitch.gif Może ten kawałek kodu w takiej postaci komuś się przyda, bo gotowców mało takich od a do z ... sam szukałem i wiem snitch.gif
Na pewno cyka na FF 3.0.10 oraz IE 7.0.6 yahoo.gif
  1. <?php
  2. //Pobieraczka v0.1 snitch.gif hehe
  3. //error'ek
  4.  define("ERROR_FILE","Nie ma takiego pliku!");
  5. //tylko liczby a jak nie to die snitch.gif
  6.  $int_options = array("options"=>array("min_range"=>1, "max_range"=>10));
  7.  if (!($pliczek = filter_var(trim($_GET['id']),FILTER_VALIDATE_INT,$int_options))) die(ERROR_FILE);
  8. // jakis katalog
  9.  $pliczki_dir = './245145/';    
  10. // lista plikow ktore mozna pobrac
  11.  $pliczki_tab = array('','plik1.cdr','plik2.cdr');
  12. // lista plików ktore można pobrać!
  13.  $link_to_file = $pliczki_dir.$pliczki_tab[$pliczek];
  14. // czy plik istnieje jak nie to die snitch.gif
  15.  if (!@file_exists($link_to_file)) die(ERROR_FILE);
  16. // plik do stringu a jak pusty to die snitch.gif      
  17.  if (!($str=file_get_contents($link_to_file))) die(ERROR_FILE);      
  18. // plik ok - wysyłanie
  19.  header("Pragma: public");
  20.  header("Expires: 0");
  21.  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  22.  header("Cache-Control: private",false);
  23.  header("Content-Description: File Transfer");
  24.  header("Content-Type: application/force-download");
  25.  header("Content-Disposition: attachment; filename=\"".$pliczki_tab[$pliczek]."\";");
  26.  header("Content-Transfer-Encoding: binary");
  27.  header("Content-Length: ".strlen($str));
  28.  echo($str);
  29.  exit();
  30. ?>


Wiem że można by i zrobić po kawałku wysyłanie i można by do tego też dodać po przerwanym downloadzie kontynuację (skrypcik), jest wiele opcji i z kawałka kodu się zaraz zrobi skrypt z użytkownikami i z bazą danych i licznikiem ściągania itp itd... ale tego na razie nie potrzeba .. ma być proste i wydajne ... może lekko obciąża serwer (myślę, że nie aż tak bo pliki jakie będą pobierane to maks 40 kB), ale cóż, zawsze jest jakaś słaba strona (wiem, że staramy się Tu aby tych stron nie było) snitch.gif
Pozdr.
KaO
Dziękuję za rady/uwagi

Witam ponownie
Troszkę mi to wierciło w głowie dziurkę z tym wysyłaniem step by step. W razie W zmodyfikowałem kod:

  1. <?php
  2. //Pobieraczka v0.2 snitch.gif hehe
  3. //error'ek
  4. define("ERROR_FILE","Nie ma takiego pliku!");
  5. //tylko liczby a jak nie to die
  6. $int_options = array("options"=>array("min_range"=>1, "max_range"=>10));
  7. if (!($pliczek = filter_var(trim($_GET['id']),FILTER_VALIDATE_INT,$int_options))) die(ERROR_FILE);
  8. // jakis katalog
  9. $pliczki_dir = './245145/';    
  10. // lista plikow ktore mozna pobrac
  11. $pliczki_tab = array('','plik1.cdr','plik2.cdr');
  12. // lista plików ktore można pobrać!
  13. $link_to_file = $pliczki_dir.$pliczki_tab[$pliczek];
  14. // czy plik istnieje jak nie to die
  15. if (!@file_exists($link_to_file)) die(ERROR_FILE);
  16. // kawaleczki snitch.gif      
  17. $down_rate = 1024*50;
  18. // otwieramy pliczek jak nie to die
  19. if (!($file_h = @fopen($link_to_file, "r"))) die(ERROR_FILE);      
  20. // wszystko ok - wysyłanie, najpierw naglowki
  21. header("Pragma: public");
  22. header("Expires: 0");
  23. header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  24. header("Cache-Control: private",false);
  25. header("Content-Description: File Transfer");
  26. header("Content-Type: application/force-download");
  27. header("Content-Disposition: attachment; filename=\"".$pliczki_tab[$pliczek]."\";");
  28. header("Content-Transfer-Encoding: binary");
  29. header("Content-Length: ".filesize($link_to_file));
  30. // wysyłanie pliczku step by step
  31. while(!feof($file_h)){
  32.    echo fread($file_h,$down_rate);
  33. }
  34. fclose($file_h);
  35. exit();
  36. ?>

I teraz moje pytania?
1. Co z plikiem jak będzie np. 10 mb i na raz (czysto teoretycznie) 10 osób będzie chciało go pobrać? Nie będzie problemu z odczytem przez to że jest step by step?
2. Czy tu nie ma "dziurek" jakiś ?>:

Pozdr.
KaO
Ps. Czekam na jakiś "odzew" snitch.gif
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.