Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP] pobieranie plików z serwera
Forum PHP.pl > Forum > Przedszkole
pavon
Witam
Mam problem ze wspomnianym już w tytule pobieraniem plików z serwera (pracuję póki co na localhost). Konkretnie: podczas pobierania plików tekstowych są one większe o 2 bajty - na początku pliku pojawia się dodatkowa pusta linia, natomiast inne typy plików (np. obrazki) są uszkodzone i nie da się ich otworzyć. Z uploadem jest wszystko w porządku (powinno), ponieważ pliki już wysłane ale jeszcze nie w żaden sposób zmienione, stąd moja diagnoza. Oto fragment mojego kodu z pliku download.php do pobierania plików (krotki komentarz poniżej):
  1. $name = $row[$db_attachment_name];
  2. //clearstatcache();
  3. //if (file_exists("attachments/".$name) && $name!=''){
  4. header("Cache-control: private");
  5. header("Content-Type: ".$row[$db_attachment_type]);
  6. header("Content-Length: ".$row[$db_attachment_size]);
  7. header("Content-Disposition: attachment; filename=\"".substr($name, 17)."\";");
  8. readfile("attachments/".$name);
  9.  
  10. //}
  11. //else{
  12. // echo "<script type=\"text/javascript\">window.alert('Wystąpił błąd: plik nie istnieje');</script>";
  13. // $sql = "DELETE FROM $db_attachment_tab WHERE $db_attachment_id='$id'";
  14. // $connection->query($sql);
  15. // header("Location: tasks_all.php?sid=".$_GET['sid']."&tid=".$_GET['tid']);
  16. //}

linia 1: w tablicy $row umieszczone są dane pliku pobrane wcześniej z bazy danych

linia 7: używam funkcji substr() aby wyciągnąć z nazwy pliku tylko tą cześć, jaką użytkownik powinien zobaczyć (poprzedni ciąg znaków służy temu, aby nie powodował błędów przy dodaniu kilku plików o tej samej nazwie), nie wiem czy to ma jakieś znaczenie i czy w tym miejscu wkrada się błąd, ale piszę tak pro forma.

linie 2,3,10-16: docelowo ma to zabezpieczyć przed błędami w sytuacji, gdy plik zostanie usunięty z serwera, ale nie zostanie usunięty z bazy danych i użytkownik będzie miał nadal możliwość kliknięcia na jednej ze stron "pobierz plik". Jednak też nie działa to tak jak powinno: otrzymuję komunikat, że strona powoduje zbyt wiele przekierowań. Co więcej nagłówek header z linii 15 powoduje wypisanie złego adresu url (z innych podstron działa to bez zarzutu) mianowicie: zamiast adresu "localhost/HD/ tasks_all.php?sid=13&tid=15" (przykładowe wartości liczbowe) pojawia się "http://localhost/HD/download.php/tasks_all.php?sid=13&tid=15".

Gdy w tym pliku testowo pisałem w niektórych miejscach "echo" aby kontrolować, czy warunek w ifie jest spełniany (tak wiem że to słabe rozwiązanie, ale jeszcze nie bardzo ogarniam debugger w NetBeansie), wszystko wypisywane było do pliku tekstowego (również ewentualne informacje o błędach z php). Wiem, że jest to spowodowane tym co dzieje się w liniach 4-8, ale czy mógłby ktoś powiedzieć mi jak użyć potem nagłówka header aby "wyjść z pliku" i móc znowu wyświetlić ewentualne komunikaty w przeglądarce oraz prawidłowo przekierować operacje na inną stronę?
nospor
Albo masz pusta linie przed <?php albo zapisujesz swoj plik .php w utf z BOM. Ustaw: utf8 bez BOM
pavon
Sprawdziłem, niestety żadne z powyższych.
dvdx95
Co to header location to mozna to obejsc
  1. $input = 'tasks_all.php?sid='.$_GET['sid'].'&tid='.$_GET['tid'];
  2. $input = trim($input, '/');
  3. if (!preg_match('#^http(s)?://#', $input)) {
  4. $input = 'http://' . $input;
  5. }
  6. $urlParts = parse_url($input);
  7. $domain = preg_replace('/^www\./', '', $urlParts['host']);
  8. header("Location: ".$domain." );


  1. header("Cache-Control: private");
  2. header("Content-Description: File Transfer");
  3. header("Content-Disposition: attachment; filename=$name");
  4. header("Content-Type: application/zip");
  5. header("Content-Transfer-Encoding: binary");
  6. readfile($name);
pavon
Cytat(nospor @ 8.08.2017, 14:40:48 ) *
Albo masz pusta linie przed <?php albo zapisujesz swoj plik .php w utf z BOM. Ustaw: utf8 bez BOM

Jednak troszkę się pospieszyłem z moją poprzednią odpowiedzią. Sprawdziłem dokładniej cały plik komentując linijka po linijce i sprawdzając, która instrukcja dopisuje wspomniany znak nowej linii. Przed znacznikiem <?php w tym pliku nie było pustej linii ale jedną z instrukcji było "require_once ...", która odnosiła się do pliku gdzie zostawiłem dodatkowy "enter" za znacznikiem ?>. Dzięki za pomoc, można zamknąć temat.
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.