[PHP]Dziwne zachowanie skryptu


(Oski225) #1

Witam,

mam skrypt, który ma za zadanie pobierać plik:

header('Content-Disposition: ' .

        'attachment; filename="' . $fname . '"');

    header('Accept-Ranges: bytes');

    header('Content-Type: application/x-unknown');

    header('Content-Transfer-Encoding: binary');

    header('Content-Length: ' . $c_length);

Problem występuje z nazwą ściąganego pliku. Jak zmienna $fname wygląda tak:

$fname = 'plik.rar'

przeglądarka dostaje taką nazwę pliku, i wszystko jest ok. Jednakże jak mam np. link:

http://www.serwer.pl/download/pliki/filefile.rar

i próbuję dodać do zmiennej $fname nazwę:

$file = 'http://www.serwer.pl/download/pliki/filefile.rar';

$fname = basename($file);

przeglądarka pobiera plik o nazwie 'pobierz.php'(nazwa skryptu). Jeśli wywołam polecenie:

echo $fname;

to w przeglądarce prawidłowo wyświetla się nazwa 'filefile.rar'.

Dodatkowo skrypt na niektórych serwerach działa, a na niektórych nie.

Czy możliwe jest, że funkcja basename zwraca string(z niektórych serwerów) o niewłaściwym kodowaniu, które nie jest przyjmowane przez php?

O co może chodzić?

Proszę o pomoc i pozdrawiam.


(Sitemaster) #2

Wrzuć cały skrypt a nie tylko jego fragment.


(etam) #3

Ale co chcesz osiągnąć z tym linkiem? Skrypt, który podałeś wysyła plik z serwera do przeglądarki, ale o co chodzi z tym linkiem? Chcesz wysłać plik, który jest na innym serwerze? To tak nie działa.


(Oski225) #4

Ahh, zapomniałem właściwie o najważniejszym.

Po przekazaniu nagłówków do przeglądarki wywołuję metodę:

$pobrano = readfile($file);

zaczynającą pobierać plik przez przeglądarkę. Czyli skrypt wygląda mniej więcej tak:

$file = 'http://www.serwer.pl/download/pliki/filefile.rar';

$fname = basename($file);

$c_length = PobierzWielkoscPliku($file);

 header('Content-Disposition: ' .

        'attachment; filename="' . $fname . '"');

    header('Accept-Ranges: bytes');

    header('Content-Type: application/x-unknown');

    header('Content-Transfer-Encoding: binary');

    header('Content-Length: ' . $c_length);


$pobrano = readfile($file);

(Sitemaster) #5

http://www.php.net/manual/pl/function.readfile.php

zobacz zwłaszcza ten link http://www.php.net/manual/pl/filesystem ... -url-fopen


(Oski225) #6

Sam plik pobiera się prawidłowo, chodzi mi tylko i wyłącznie o nazwę pliku, którą odczytuje(a właściwie to nie odczytuje) przeglądarka.


([alex]) #7

Czy chodzi ci o rozpoznanie ścieżki do pliku?

i z napisu:

'http://www.serwer.pl/download/pliki/filefile.rar'

chcesz otrzymać:

'/dane_www/dane_serwera/download/pliki/filefile.rar'

?


(Sitemaster) #8

Cóż, podany przykład działa u mnie bez zarzutu - pobiera z nazwą filefile.rar

Wszak jednego headera bym ciut poprawił na:

header('Content-Disposition: attachment; filename="'.$fname.'"');

Zgaduję jednak, że problem występuje dla innego adresu - więc może go podasz zamiast tego przykładowego, bo zapewne w tymże adresie tkwi przyczyna błędu.


(Oski225) #9

Udało mi się rozwiązać problem.

Okazało się, że link posiada białe znaki na końcu, przez co nie występował mój błąd.

Wystarczyło użyć funkcji trim() i wszystko działa jak powinno.

Dziękuje za pomoc i pozdrawiam.