Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php][ff]wysyłanie pliku do przeglądarki w nagłówku
Forum PHP.pl > Forum > PHP
mrok
Witam

Mam problem z dawnloadem plików w FF. O dziwo wywala się to tylko w FF natomiast inne przeglądarki (IE6,7 Opera, Safari) jakoś sobie radzą.

Do wysłania pliku służy mi poniższy kod.

  1. <?php
  2. class File {
  3.  
  4. private $fileName;
  5. private $filePosition;
  6. private $type;
  7.  
  8. public function __construct($newName='', $position='', $type=''){
  9. $this->fileName=$newName;
  10. $this->filePosition=$position;
  11. $this->type = $type;
  12. }
  13.  
  14.  
  15. public function sendFileToUser(){
  16. //wysyla plik do przegladarki
  17. $fullPatch = 'files/' .$this->fileName;
  18. $extension = strtolower(substr($this->fileName, strripos($this->fileName,'.')+1));
  19. $this->prepareHeaderToSend($fullPatch, $this->fileName, $extension);
  20. $this->sendFile($fullPatch);
  21. }
  22.  
  23. private function sendFile($fullPath){
  24. //wysyla plik
  25. $fp = fopen($fullPath, 'rb');
  26. fpassthru($fp);
  27. }
  28.  
  29. private function prepareHeaderToSend ($fullPath, $fileName, $extension)
  30. {
  31. $filesize = filesize($fullPath);
  32. //ustawiam Content-Type dla danego pliku
  33. switch ($extension)
  34. {
  35. case 'pdf': $type='application/pdf'; break;
  36. case 'exe': $type='application/octet-stream'; break;
  37. case 'zip': $type='application/zip'; break;
  38. case 'doc': $type='application/msword'; break;
  39. case 'xls': $type='application/vnd.ms-excel'; break;
  40. case 'ppt': $type='application/vnd.ms-powerpoint'; break;
  41. case 'gif': $type='image/gif'; break;
  42. case 'png': $type='image/png'; break;
  43. case 'jpeg':
  44. case 'jpg': $type='image/jpg'; break;
  45. case 'mp3': $type='audio/mpeg'; break;
  46. case 'wav': $type='audio/x-wav'; break;
  47. case 'mpeg':
  48. case 'mpg':
  49. case 'mpe': $type='video/mpeg'; break;
  50. case 'mov': $type='video/quicktime'; break;
  51. case 'avi': $type='video/x-msvideo'; break;
  52. //Ponizszych w zadnym wypadku nie mozna sciagac
  53. case 'php':
  54. case 'htm':
  55. case 'html': 
  56. throw new Exception('wrong file type'); 
  57. break;
  58. default: $type='application/force-download';
  59. }
  60. header('Cache-Control: max-age=0');
  61. header('Cache-Control: private');
  62. header('Content-Description: File Transfer');
  63. header('Content-Type: ' .$type);
  64.  
  65. $tmpName = 'Plik' .date('d-m-y') .'.' .$extension;
  66. header('Content-Disposition: attachment; filename=' .$tmpName);
  67. header('Content-Transfer-Encoding: binary');
  68. header('Content-Length: '.$filesize);
  69. }
  70.  
  71. }
  72. ?>


Po wykonaniu
  1. <?php
  2. $f = new File("plik.pdf");
  3. $f -> sendFileToUser();
  4. ?>

Pojawia się piękne okienko z pytaniem gdzie zapisać plik.
Problem pojawia się dopiero po ściągnięciu pliku (lub anulowaniu operacji), kliknięcie na jakikolwiek link na stronie (w FF) skutkuje

I) wyświetleniem w przeglądarce czystego Htmla (znaczniki)
II) wyświetlenie poniżej aktualnie załadowanej strony, drugiej(właściwej). Ale powtarza się wtedy wszystko (nagłówek, stopka, etc). Dodatkowo zostaję poinformowany o nastepującym
“HTTP/1.1 200 OK Date: Sun, 20 Apr 2008 11:39:35 GMT Server: Apache/1.3.37 (Unix) Cache-Control: no-store, no-cache, must-revalidate, post-check=0, pre-check=0 Expires: Thu, 19 Nov 1981 08:52:00 GMT Pragma: no-cache X-Powered-By: PHP/5.1.4 Set-Cookie: PHPSESSID=957ee335dc3af03f9ebb160c998bbeb4878bb433; path=/ Keep-Alive: timeout=15, max=994 Connection: Keep-Alive Transfer-Encoding: chunked Content-Type: text/html;charset=UTF-8 229”

co niestety nie pozwala mi rozwiazac problemu ;( (wydaje mi sie ze to przegladarka niepotrzebnie wyswietlila naglowek, a nie jakas pomocna informacja o problemie)

Firebug nie informuje o żadnym błędzie…

Ma ktoś pomysł w czym tkwi problem, lub widzi jakis blad??
Najbardziej irytuje mnei to, iz dzieje sie tak tylko w FF - inne przegladarki radza sobie normalnie

//edit poprawilem tag
ayeo
  1. <?php
  2. case 'php': $type="text/html"; break;
  3. case 'htm': $type="text/html"; break;
  4. case 'html': $type="text/html"; break;
  5. ?>


Spróbuj tak
Piniek
Proszę o dodanie odpowiedniego tagu do tematu.

Pozdrawiam
mrok
Cytat(ayeo @ 20.04.2008, 14:03:56 ) *
  1. <?php
  2. case 'php': $type="text/html"; break;
  3. case 'htm': $type="text/html"; break;
  4. case 'html': $type="text/html"; break;
  5. ?>


Spróbuj tak


Dzięki ayeo, ale to nie rozwiazuje problemu ;(

Dodam jeszcze ze FF po operacji opisanej w pierwszym poscie (wyświetlenie zdublowanej strony lub czystego htmla) traci całkiem sesje (cos jak automatyczne wylogowanie).


Piniek
Cytat
Proszę o dodanie odpowiedniego tagu do tematu.

dzieki za uwage - juz poprawilem
ayeo
U mnie, po tych poprawkach jak wyżej, działa tak jak powinno! Pobiera mi pliki html, php, htm i wszystkie inne uwzględnione w tej klasie.
mrok
Cytat
U mnie, po tych poprawkach jak wyżej, działa tak jak powinno! Pobiera mi pliki html, php, htm i wszystkie inne uwzględnione w tej klasie.

to sie troche nie zrozumielismy winksmiley.jpg

Plik sciaga sie poprawnie, nastomiast po sciagnieciu pliku i wybraniu jakiegokolwiek linka (do podstrony), zamiast strony wyswietla sie

  1. nmouseout="style.background='#C3333C'" onmouseover="style.background='#366FF3'"><a href="admin.php/admin/numer/default">numer</a></span>
  2. <span class="menuTopElement" onmouseout="style.background='#C3333C'" onmouseover="style.background='#366FF3'"><a href="admin.php/admin/mail/default">maile</a></span>
  3. <span class="menuTopElement" onmouseout="style.background='#C3333C'" onmouseover="style.background='#366FF3'"><a href="admin.php/admin/parametry/default">parametry</a></span>
  4. <span class="menuTopElement" onmouseout="style.background='#C3333C'" onmouseover="style.background='#366FF3'"><a href="admin.php/admin/role/default">role</a></span>
  5. <span class="menuTopElement" onmouseout="style.background='#C3333C'" onmouseover="style.background='#366FF3'"><a href="admin.php/admin/users/default">użytkownicy</a></span>
  6.  
  7. </div>
  8.  
  9. <div id="menu">
  10. Wyloguj:<a href="admin.php/admin/info/default/action/logout"> Admin Admin</a> <br>
  11. menu
  12.  
  13. </div>
  14. <div id="content"><table>
  15. i reszta htmla


i to jest glowny problem
ayeo
To może dodaj fclose($fp); do metody sendFile();

PS U mnie działa poprawnie i tak i tak biggrin.gif
mrok
sluszna uwaga winksmiley.jpg))


zrobilem maly test i wyizolowalem z swojego projektu tylko te klase (bez logowania, smarty i innych takich) i odpalilem w innym miejscu- wszystko dziala jak nalezy. kurcze musze w takim razie czegos innego poszukac.... i dlaczego tylko ff?questionmark.gif echh trudno

dzieki za pomoc ayeo
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.