Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP] pobieraczka :>
Kao
post
Post #1





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 19.10.2004
Skąd: Zgorzelec

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi (1 - 3)
erix
post
Post #2





Grupa: Moderatorzy
Postów: 15 467
Pomógł: 1451
Dołączył: 25.04.2005
Skąd: Szczebrzeszyn/Rzeszów




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?


--------------------

ZCE :: Pisząc PW załączaj LINK DO TEMATU i TYLKO w sprawach moderacji :: jakiś błąd - a TREŚĆ BŁĘDU? :: nie ponaglaj z odpowiedzią via PW!
Go to the top of the page
+Quote Post
Pilsener
post
Post #3





Grupa: Zarejestrowani
Postów: 1 590
Pomógł: 185
Dołączył: 19.04.2006
Skąd: Gdańsk

Ostrzeżenie: (0%)
-----


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+
Go to the top of the page
+Quote Post
Kao
post
Post #4





Grupa: Zarejestrowani
Postów: 26
Pomógł: 0
Dołączył: 19.10.2004
Skąd: Zgorzelec

Ostrzeżenie: (0%)
-----


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
Go to the top of the page
+Quote Post

Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 21.08.2025 - 20:55