Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] pobieranie pliku
Forum PHP.pl > Forum > Przedszkole
patryk20120
Witam mam taki problem.
Mam ten kod na stronie:
  1. <?php
  2. $file = 'test.doc';
  3.  
  4.    if (! is_file($file))
  5.    {
  6.        header('HTTP/1.1 404 File Not Found');
  7.        die();
  8.    }
  9.  
  10.    $fname = basename($file);
  11.    $fsize = filesize($file);
  12.    $ftime = filemtime($file);
  13.    $range = $_SERVER['HTTP_RANGE'];
  14.  
  15.    $r_start = 0;
  16.    $c_length = $fsize;
  17.  
  18.    if ($range)
  19.    {
  20.        $reg = "/bytes=([0-9]+)-([0-9]*)/";
  21.        preg_match($reg, $range, $matches);
  22.  
  23.        $r_start = (int) $matches[1];
  24.        $r_stop = (int) $matches[2];
  25.        if ($r_stop < $r_start) $r_stop = $fsize - 1;
  26.        $c_length = $r_stop - $r_start + 1;
  27.  
  28.        header('HTTP/1.1 206 Partial Content');
  29.        header('Content-Range: bytes ' .
  30.            $r_start . '-' . $r_stop . '/' . $fsize);
  31.    }
  32.    else
  33.    {
  34.        header('HTTP/1.1 200 OK');
  35.    }
  36.  
  37.    header('Last-Modified: ' .
  38.        gmdate('D, d M Y H:i:s', $ftime) . ' GMT');
  39.    header('Content-Disposition: ' .
  40.        'attachment; filename="' . $fname . '"');
  41.    header('Accept-Ranges: bytes');
  42.    header('Content-Type: application/x-unknown');
  43.    header('Content-Transfer-Encoding: binary');
  44.    header('Content-Length: ' . $c_length);
  45.  
  46.    if ($fp = fopen($file, 'rb'))
  47.    {
  48.        flock($fp, 1);
  49.        fseek($fp, $r_start);
  50.        echo(fread($fp, $c_length));
  51.        flock($fp, 3);
  52.        fclose($fp);
  53.    }
  54. ?>

Lecz zamiast mi go pobierać to on się wyświetla (chyba bo jakies znaczki tongue.gif ) + błędy typu:
Warning: Cannot modify header information - headers already sent by...
Co zrobić, aby mi ten plik pobierało questionmark.gif
piotrooo89
było naprawdę setki razy na forum o tym poszukaj i poczytaj!
patryk20120
No dobrze, mam pobiera mi go, lecz wyświetla treść( w pliku pobranym) źródło strony, a nie zawartość pliku...

Dodałem to:
  1. <?php
  2. header("Content-Type: application/msword");
  3. ?>

lecz w pliku nadal jest kod strony...
marcio
Poprostu daj kod ktory ma robic download plikow do oddzielnego pliku *.php gdzie nie ma kodu html i bedzie good tez mialem taki problem.

  1. <?php
  2. if ($fp = fopen($file, 'rb'))
  3.   {
  4.       flock($fp, 1);
  5.       fseek($fp, $r_start);
  6.       echo(fread($fp, $c_length));
  7.       flock($fp, 3);
  8.       fclose($fp);
  9.   }
  10. ?>

Oszczedz to sobie i zastap za pomoca readfile($file);
patryk20120
marcio, tak, lecz po kodzie strony jest treść pliku, lecz są to same jakieś znaczki tongue.gif
marcio
Blad napewno siedzi w naglowkach i tym niepotrzebnym kombinowaniem podczac wczytywaniu pliu daj tylko potrzebne naglowki i tyle:
  1. <?php
  2. if (! is_file($file))
  3.    {
  4.        header('HTTP/1.1 404 File Not Found');
  5.        die();
  6.    }
  7. else {
  8.  
  9.            header('Content-type: application/x-unknown');
  10.            header('Content-Disposition: attachment; filename='.$file);
  11.            header('Connection: close');
  12.            header('Expires: 0');
  13.            readfile($file);
  14. }
  15. ?>
patryk20120
Dalej to samo, plik się pobiera w dobrym formacie, lecz jest w nim kod strony tongue.gif
marcio
Jaki kod wklej go tu.
patryk20120
Wklejam tak jak mi napisałeś tongue.gif
  1. <?php
  2. $file = 'test.doc';
  3.  
  4.   if (! is_file($file))
  5.   {
  6.       header('HTTP/1.1 404 File Not Found');
  7.       die();
  8.   }
  9. else {
  10.  
  11.           header('Content-type: application/x-unknown');
  12.           header('Content-Disposition: attachment; filename='.$file);
  13.           header('Connection: close');
  14.           header('Expires: 0');
  15.           readfile($file);
  16. }
  17. ?>
marcio
Pokaz zawartosc pliku jakiego ci pobiera.
patryk20120
Jest to tabelka z tekstem w formacie *.doc...
phpion
Zamiast:
  1. <?php
  2. header('Content-type: application/x-unknown');
  3. ?>

daj:
  1. <?php
  2. header('Content-type: application/msword');
  3. ?>
patryk20120
Dawałem już wcześniej i dalej nie pomaga...
phpion
No to jeszcze to:
  1. <?php
  2. header('Content-Disposition: attachment; filename='.$file);
  3. ?>

na:
  1. <?php
  2. header('Content-Disposition: attachment; filename="'.$file.'"');
  3. ?>

i po readfile($file); daj dla pewności:
  1. <?php
  2. ?>
gox
Eh ludzki, jakie readfile()...
Na prawde nie widzicie, że skrypt służy do pobierania przerywanego, pozwala na wznawianie....
bez fseek() raczej ciężko..

Kodzik przekopiowany na żywca z tej strony: http://4programmers.net/PHP/Pobieranie_pli...nego_połączenia
patryk20120
Niestety nie działa, mój teraźniejszy kod wygląda tak:
  1. <?php
  2. $file = 'test.doc';
  3.  
  4.   if (! is_file($file))
  5.   {
  6.       header('HTTP/1.1 404 File Not Found');
  7.       die();
  8.   }
  9. else {
  10.  
  11.           header('Content-type: application/msword');
  12.           header('Content-Disposition: attachment; filename="'.$file.'"');
  13.           header('Connection: close');
  14.           header('Expires: 0');
  15.           readfile($file);
  16.           exit;
  17. }
  18. ?>
l0ud
Upewnij się, czy przed <?php nie masz żadnego znaku (chociażby nowej linii, spacji), oraz czy ten plik (skrypt) nie jest zapisany w kodowaniu UTF-8 z BOM.
patryk20120
przed <?php nie ma nic, lecz gdy zmieniam na UTF-8 z BOM to zamiast plik pobierać to wyświetla jakieś znaczki na stronie...
piotrooo89
poczytaj co to jest BOM... jak dasz sobie z BOM to będą się wyświetlać.
patryk20120
No właśnie tongue.gif nie chcę żeby plik wyświetlało na stroni i to jeszcze zniekształcony tylko żeby go pobrało...
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.