Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> Download pliku tylko do 2M. Dlaczego obcina resztę, Problem z PHP lub z konfiguracją serwera
hespis
post 24.08.2005, 20:40:30
Post #1





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 24.08.2005
Skąd: Warszawa

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


Witam!

Spotkałem się z dziwnym problem, którego na ten czas nie potrafię sam rozwiązać. Napisałem skrypt, którego zadaniem jest umożliwianie użytkownikom ściąganie niektórych, wybranych plików. Proces ten oparty jest na wysyłaniu nagłówka do przeglądarki. Kluczowy fragment kodu (źródło php.net):

  1. <?php
  2.  
  3. $url = $directory."/".$filename;
  4. $file_extension = strtolower(substr(strrchr($filename,"."),1));
  5.  
  6. switch ($file_extension) {
  7. case "pdf": $ctype="application/pdf"; break;
  8. case "exe": $ctype="application/octet-stream"; break;
  9. case "zip": $ctype="application/zip"; break;
  10. case "rar": $ctype="application/rar"; break;
  11. case "doc": $ctype="application/msword"; break;
  12. case "xls": $ctype="application/vnd.ms-excel"; break;
  13. case "ppt": $ctype="application/vnd.ms-powerpoint"; break;
  14. case "gif": $ctype="image/gif"; break;
  15. case "png": $ctype="image/png"; break;
  16. case "jpe": case "jpeg":
  17. case "jpg": $ctype="image/jpg"; break;
  18. default: $ctype="application/force-download";
  19. }
  20.  
  21. if (!file_exists($url)) {
  22.  die("NO FILE HERE");
  23. }
  24.  
  25. header("Pragma: public");
  26. header("Expires: 0");
  27. header("Cache-Control: must-revalidate, post-check=0, pre-check=0");
  28. header("Cache-Control: private", false);
  29. header("Content-Type: $ctype");
  30. header("Content-Disposition: attachment; filename="".basename($url)."";");
  31. header("Content-Transfer-Encoding: binary");
  32. header("Content-Length: ".filesize($url));
  33. readfile("$url") or die("File not found.");
  34.  
  35. ?>


Wszystko jest w porządku do czasu, kiedy plik jest większy niż 2MB - większe dokumenty są docinane do nieszczęsnego rozmiaru. Jak się z tym uporać?

Pozdrawiam

----------------------------------------------------------------
Dla kodu php uzywamy [php] a nie [CODE]. DreeD


Ten post edytował DreeD 24.08.2005, 21:58:02
Go to the top of the page
+Quote Post
zbig13
post 25.08.2005, 08:28:36
Post #2





Grupa: Zarejestrowani
Postów: 214
Pomógł: 0
Dołączył: 3.04.2004
Skąd: Legionowo

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


Prawdopodobnie wynika to z konfiguracji php. Standardowo zmienna upload_max_filesize (w sekcji File uploads w pliku php.ini) jest ustawiona na 2M. Dlatego pliki są "ucinane". Jeśli chcesz uploadować większe pliki musisz zwiększyć trochę wartość upload_max_filesize.
Pozdrawiam!
Go to the top of the page
+Quote Post
Sh4dow
post 25.08.2005, 08:39:24
Post #3





Grupa: Zarejestrowani
Postów: 569
Pomógł: 0
Dołączył: 17.08.2003
Skąd: Dąbrowa Górnicza

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


z wielkoscia upload_max_filesize przydalo by sie zwiekszyc wartosc post_max_size przy ladowaniu plikow przez formularze.


--------------------
Warsztat: Linux: PHP, MySQL, Apache, NetBeans, C++, Qt-Creator
Użytkownik, słowo którego specjaliści IT używają, gdy chcą powiedzieć idiota
Zarządzaj swoim budżetem domowym
Go to the top of the page
+Quote Post
dr_bonzo
post 25.08.2005, 09:51:09
Post #4





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


LOL: jemu chodzi o DOWNLOAD PLIKOW.


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
hespis
post 25.08.2005, 09:56:25
Post #5





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 24.08.2005
Skąd: Warszawa

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


Witam!

Dokładnie, chodziło mi o download plików z serwera...
Po dokonaniu zmian w dwóch wyżej wymienionych zmiennych: upload_max_filesize i post_max_size (jedną i drugą ustawiłem na 16M), rezultat działania skryptu pozostał bez zmian. Dodam jeszcze, że przy stosowaniu "tradycyjnego" linku bezpośrednio do pliku, problem nie występuje.

Ten post edytował hespis 25.08.2005, 09:58:57
Go to the top of the page
+Quote Post
pafka
post 25.08.2005, 11:57:53
Post #6





Grupa: Zarejestrowani
Postów: 33
Pomógł: 1
Dołączył: 8.01.2005

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


a jakie masz ustawiania pamieci ? bo to jest chyba przyczyna

zwieksz limit w php.ini albo w skrypcie

  1. <?php
  2.  
  3. ini_set('memory_limit', '4M');
  4.  
  5. ?>



albo nie czytaj calej zawartosci pliku przez readfile tylko w petli czytaj po kawalku i wysylaj

Ten post edytował pafka 25.08.2005, 11:59:55
Go to the top of the page
+Quote Post
hespis
post 25.08.2005, 12:26:10
Post #7





Grupa: Zarejestrowani
Postów: 10
Pomógł: 0
Dołączył: 24.08.2005
Skąd: Warszawa

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


Znalazłem! biggrin.gif

Otóż okazało się, że readfile ma ograniczenie do 2M.
W manualu (szkoda, że nie zawsze czytam je do końca) znalazłem odpowiedź, a właściwie gotowy kod do zastosowania.

Źródło: php.net -> tutaj

  1. <?php
  2. function readfile_chunked($filename,$retbytes=true) {
  3.    $chunksize = 1*(1024*1024); // how many bytes per chunk
  4.    $buffer = '';
  5.    $cnt =0;
  6.    // $handle = fopen($filename, 'rb');
  7.    $handle = fopen($filename, 'rb');
  8.    if ($handle === false) {
  9.        return false;
  10.    }
  11.    while (!feof($handle)) {
  12.        $buffer = fread($handle, $chunksize);
  13.        echo $buffer;
  14.        flush();
  15.        if ($retbytes) {
  16.            $cnt += strlen($buffer);
  17.        }
  18.    }
  19.        $status = fclose($handle);
  20.    if ($retbytes && $status) {
  21.        return $cnt; // return num. bytes delivered like readfile() does.
  22.    }
  23.    return $status;
  24.  
  25. }
  26. ?>



Pozdrawiam winksmiley.jpg

Ten post edytował hespis 25.08.2005, 12:31:46
Go to the top of the page
+Quote Post
dr_bonzo
post 25.08.2005, 13:08:21
Post #8





Grupa: Przyjaciele php.pl
Postów: 5 724
Pomógł: 259
Dołączył: 13.04.2004
Skąd: N/A

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


  1. <?php
  2.  
  3. if ( ( $content = file_get_contents( $filename ) ) !== FALSE )
  4. {
  5. print( $content );
  6. }
  7. else
  8. {
  9. print( 'Error' );
  10. }
  11.  
  12. ?>

Nie prosciej?


--------------------
Nie lubię jednorożców.
Go to the top of the page
+Quote Post
czaja09
post 21.09.2006, 10:50:24
Post #9





Grupa: Zarejestrowani
Postów: 5
Pomógł: 0
Dołączył: 25.09.2005

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


Uzyłem kodu, który podał hespis. Działa, ale niestety nie na moim hostingu.
Użycie pamięci nadal wzrasta razem z ilością ściąganych danych...

Ktoś wie jaka może być tego przyczyna? Zła konfiguracja maszyny?
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 Wersja Lo-Fi Aktualny czas: 16.07.2025 - 04:00