Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Download pliku tylko do 2M. Dlaczego obcina resztę
Forum PHP.pl > Forum > Przedszkole
hespis
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
zbig13
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!
Sh4dow
z wielkoscia upload_max_filesize przydalo by sie zwiekszyc wartosc post_max_size przy ladowaniu plikow przez formularze.
dr_bonzo
LOL: jemu chodzi o DOWNLOAD PLIKOW.
hespis
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.
pafka
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
hespis
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
dr_bonzo
  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?
czaja09
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?
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.