Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Skrypt do pobierania plików
Forum PHP.pl > Forum > Przedszkole
q3d
Pewne pliki: (jpg, pdf, archiwa .zip) chciałbym pobierać z serwera ale nie bezpośrednio tworząc odsyłacze ale poprzez skrypt (lokalizacja plików powyżej katalogu głównego serwisu). W tym celu wykorzystuje funkcję:
  1. function download_document($page) {
  2. $path = BASE_DOCS_URI.$page['url'][1][6].'/'.$page['id'];
  3. $fullPath = $path.'/'.$page['url'][1][7];
  4.  
  5. if ($fd = fopen ($fullPath, "r")) {
  6. $fsize = filesize($fullPath);
  7. $path_parts = pathinfo($fullPath);
  8. $ext = strtolower($path_parts["extension"]);
  9.  
  10. switch ($ext) {
  11. case "pdf":
  12. header("Content-type: application/pdf"); // add here more headers for diff. extensions
  13. header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
  14. break;
  15. case "jpg":
  16. header("Content-type: application/jpg"); // add here more headers for diff. extensions
  17. header("Content-Disposition: attachment; filename=\"".$path_parts["basename"]."\""); // use 'attachment' to force a download
  18. break;
  19. default;
  20. header("Content-type: application/octet-stream");
  21. header("Content-Disposition: filename=\"".$path_parts["basename"]."\"");
  22. }
  23. header("Content-length: $fsize");
  24. header("Cache-control: private"); //use this to open files directly
  25. while(!feof($fd)) {
  26. $buffer = fread($fd, 2048);
  27. echo $buffer;
  28. }
  29. }
  30. fclose ($fd);
  31. }


Dla dokumentów pdf jest ok.

Problem dotyczy plików zdjęć (.jpg). Niezależnie czy pobrany plik wyświetle w programie do przeglądania obazów czy też w zapiszę lokalnie, a następnie wyświetlę otrzymuje błąd:
"Not a JPEG file: starts with 0x0d 0x0a".

Plik przekopiowany przez FTP lub przeniesiony do katalogu tak by umożliwić do niego dostęp z poziomu adresu przeglądarki internetowej wyświetla się jednak poprawnie. Czyli plik nie jest uszkodzony i jak sądzę zostaje uszkodzony w momencie przesyłania.

Co gorsza błąd występuje wyłącznie gdy pobieram plik z serwera produkcyjnego. Na moim localhoscie pobierane w ten sposób pliki graficzne wyświetlają się poprawnie.

Jakieś sugestie?
nospor
Twoj skrypt wysyla procz obrazku rowniez znak nowej linii.
Pewnie gdzies w kodzie po drodze masz takowy, np na poczatku
<?php
jest nowa linia wpierw smile.gif
q3d
Być może. Będę to sprawdzał. Jednak czy o tym, że problem może wynikać z czegoś innegonie świadczy fakt, że:
1) pliki .pdf pobierane są poprawnie,
2) na localhost ten sam skrypt działa poprawnie i pliki graficzne są pobierane jako nieuszkodzone,
3) całość przed wysłaniem jest buforowana ob_start(); ob_end(); więc nic chyba nie powinno być przed nagłówkami wysyłane.
nospor
PLikom pdf moze nie szkodzic ten enter. Czytniki moga go poprostu ignorowac.
Co do buforowania to moze zalezec wszystko od ustawien php na serwerze.

Masz az tyle plikow po drodze ze znalezienie tego entera to nie kwestia minuty?
q3d
ad 1)
Pewnie .pdf nie przeszkadza
ad 2 i 3)
to już wiadomo dlaczego na localhost może działać, a na serwerze już nie koniecznie.

Plików raczej nie ma dużo. Główny plik index.php który to wszystko skleja w całość. Plik, który odpowiedzialny jest za działanie sekcji pobierania plików (w nim wywołanie tej funkcji). No i includowane pliki funkcji. Problem więc nie wynika raczej z ilości plików, a z tego, że nie wiem czego szukać wink.gif

Czy w Web Developerze lub jakimś innym narzędziem w przeglądarce można prześledzić co i kiedy jest wysyłane do przeglądarki czyli wychwycić ten znak nowej linii? Czy do odnalezienia takiego miejsca można czegoś użyć po za doświadczeniem i spostrzegawczością?

Ok. Mam smile.gif

Oczywiście miałeś rację i przed nagłówkami były wysyłane do przeglądarki znaki. Trochę jednak sprawa wygląda inaczej bo do jednego z includowanych plików na początku był dodany złośliwy kod.

Znak nowej linii był widoczny w źródle strony. Kod
  1. <!DOCTYPE html>
  2. ...


i cała reszta zaczynała się od drugiej linii.

Na localhoscie pracuje na niezainfekowanych plikach i dlatego to działało...

Dziękuje.
nospor
Hehe, to i przy okazji znalazles wirusa biggrin.gif Wisisz mi garnczek miodku jak nic wink.gif
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.