Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> [PHP]Skrypt do pobierania plików
q3d
post
Post #1





Grupa: Zarejestrowani
Postów: 98
Pomógł: 7
Dołączył: 10.01.2006

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


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?
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
q3d
post
Post #2





Grupa: Zarejestrowani
Postów: 98
Pomógł: 7
Dołączył: 10.01.2006

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


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ć (IMG:style_emoticons/default/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 (IMG:style_emoticons/default/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.

Ten post edytował q3d 23.11.2016, 13:32:16
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
2 Użytkowników czyta ten temat (2 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 15.10.2025 - 01:45