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?
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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
Na pewno cyka na FF 3.0.10 oraz IE 7.0.6 (IMG:http://forum.php.pl/style_emoticons/default/yahoo.gif)
  1. <?php
  2. //error'ek
  3.  define("ERROR_FILE","Nie ma takiego pliku!");
  4. //tylko liczby a jak nie to die (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
  5.  $int_options = array("options"=>array("min_range"=>1, "max_range"=>10));
  6.  if (!($pliczek = filter_var(trim($_GET['id']),FILTER_VALIDATE_INT,$int_options))) die(ERROR_FILE);
  7. // jakis katalog
  8.  $pliczki_dir = './245145/';    
  9. // lista plikow ktore mozna pobrac
  10.  $pliczki_tab = array('','plik1.cdr','plik2.cdr');
  11. // lista plików ktore można pobrać!
  12.  $link_to_file = $pliczki_dir.$pliczki_tab[$pliczek];
  13. // czy plik istnieje jak nie to die (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
  14.  if (!@file_exists($link_to_file)) die(ERROR_FILE);
  15. // plik do stringu a jak pusty to die (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)      
  16.  if (!($str=file_get_contents($link_to_file))) die(ERROR_FILE);      
  17. // plik ok - wysyłanie
  18.  header("Pragma: public");
  19.  header("Expires: 0");
  20.  header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  21.  header("Cache-Control: private",false);
  22.  header("Content-Description: File Transfer");
  23.  header("Content-Type: application/force-download");
  24.  header("Content-Disposition: attachment; filename=\"".$pliczki_tab[$pliczek]."\";");
  25.  header("Content-Transfer-Encoding: binary");
  26.  header("Content-Length: ".strlen($str));
  27.  echo($str);
  28.  exit();
  29. ?>


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) (IMG:http://forum.php.pl/style_emoticons/default/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. //error'ek
  3. define("ERROR_FILE","Nie ma takiego pliku!");
  4. //tylko liczby a jak nie to die
  5. $int_options = array("options"=>array("min_range"=>1, "max_range"=>10));
  6. if (!($pliczek = filter_var(trim($_GET['id']),FILTER_VALIDATE_INT,$int_options))) die(ERROR_FILE);
  7. // jakis katalog
  8. $pliczki_dir = './245145/';    
  9. // lista plikow ktore mozna pobrac
  10. $pliczki_tab = array('','plik1.cdr','plik2.cdr');
  11. // lista plików ktore można pobrać!
  12. $link_to_file = $pliczki_dir.$pliczki_tab[$pliczek];
  13. // czy plik istnieje jak nie to die
  14. if (!@file_exists($link_to_file)) die(ERROR_FILE);
  15. $down_rate = 1024*50;
  16. // otwieramy pliczek jak nie to die
  17. if (!($file_h = @fopen($link_to_file, "r"))) die(ERROR_FILE);      
  18. // wszystko ok - wysyłanie, najpierw naglowki
  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: ".filesize($link_to_file));
  28. // wysyłanie pliczku step by step
  29. while(!feof($file_h)){
  30.    echo fread($file_h,$down_rate);
  31. }
  32. fclose($file_h);
  33. exit();
  34. ?>

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" (IMG:http://forum.php.pl/style_emoticons/default/snitch.gif)
Go to the top of the page
+Quote Post

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

 



RSS Aktualny czas: 23.08.2025 - 19:00