[PHP] wysyłanie pliku poprzez header()

0
  ob_end_clean();
  header("Content-Disposition: attachment; filename=\"$nazwa\"");
  header("Content-type: ".$typ);
  readfile($plik);

problem pojawia sie tylko w IE gdy kliknę na Otwórz (pod FF jest OK) a mianowicie przeglądarka informuje mnie o niewłaściwym typu nagłówka pliku i nie może go otworzyć, gdy dam Zapisz to zapisze się OK

0

a jakie rozszerzenie ma $nazwa, co masz w $typ, daj więcej kodu

0
ssnake napisał(a)
header("Content-Disposition: attachment; 

attachment, czyli zalacznik, czlyli zapisac go, a nie otworzyc, jesli chcesz to cos otworzyc musisz sie pobawic z typami, najlepiej zobacz jak to jest robione (jaki typ zalacznika co jest napisane) przy naglowkach maili :]

0
desperat napisał(a)
ssnake napisał(a)
header("Content-Disposition: attachment; 

attachment, czyli zalacznik, czlyli zapisac go, a nie otworzyc,

czyli pojawia się okienko otwórz / zapisz (otwórz oczywiście oznacza zapisanie tymaczasowe) - dobrze jest tu nic nie kombinuj

0
Adamo napisał(a)

a jakie rozszerzenie ma $nazwa, co masz w $typ, daj więcej kodu

podczas upload'u pliku na serwer zapisuje jego oryginalna nazwe i typ (mime) pobrane z $_FILES w bazie danych a sam plik trzymam pod inna nazwą w jednym z katalogów na serwerze...

podkreslam, że problem występuje tylko pod IE i tylko w przypadku gdy wybiore opcje "Otworz"

z tego co zaobserwowałem to w momencie pojawienia sie pytania czy plik otworzyc czy zapisac IE sciaga go do TEMPa ale nie w calosci
testowalem na 2 plikach w przypaku jpg byla to raczej stala wartosc okolo 8000 bajtów
a w przypadku GZ losowa :/ raz 200 kb raz 1MB

0

czyli $nazwa zawiera "c:\hej.jpg" czy "hej.jpg" ??

0
Adamo napisał(a)

czyli $nazwa zawiera "c:\hej.jpg" czy "hej.jpg" ??

nazwa zawiera hej.jpg a typ image/jpeg

PS.
nie wiem czy wiecej kodu tu pomoze ale w calosci wyglada to tak:

function pobierz_plik($id){
  $sql = "select * from pliki where id=$id";
  $res = mysql_query($sql) or exit(mysql_error());
  $arr = mysql_fetch_array($res);
  
  ob_end_clean();
  header("Content-Disposition: attachment; filename=\"".$arr['nazwa']."\"");
  header("Content-type: ".$arr['typ']);
  readfile("PLIKI/".$arr['plik']);
}
0

Jeśli nie zawsze ściąga się cały plik, to może spróbuj z:

header( 'Content-Length: '.filesize($arr['plik']) );
0
ssnake napisał(a)
Adamo napisał(a)

czyli $nazwa zawiera "c:\hej.jpg" czy "hej.jpg" ??

nazwa zawiera hej.jpg a typ image/jpeg

PS.
nie wiem czy wiecej kodu tu pomoze ale w calosci wyglada to tak:

function pobierz_plik($id){
  $sql = "select * from pliki where id=$id";
  $res = mysql_query($sql) or exit(mysql_error());
  $arr = mysql_fetch_array($res);
  
  ob_end_clean();
  header("Content-Disposition: attachment; filename=\"".$arr['nazwa']."\"");
  header("Content-type: ".$arr['typ']);
  readfile("PLIKI/".$arr['plik']);
}

może to problem twojej przeglądarki, może nie masz zaisntalowanych wszystkich "łatek"
spróbuj czy jakkolwiek zadziała bez dwóch linijek przed content-type
spróbuj z content-length
może być problem jeśli PHP jest odpalane jako moduł CGI
może wersja PHP jest jakaś stara i readfile nie traktuje plików binarnie
dane mime w $_FILES nie jest czasem pobierane od usera ? jeśli tak to jeśli nawet uploadowałeś inną przeglądarką niż pobierasz to może być problem, lepiej zrób tablicę predefiniowanych typów albo wysyłaj wszystko jako może mime_content_type('PLIKI/'.$arr['plik']) albo np application/x-unknown

0
ssnake napisał(a)
mysql_query($sql) or exit(mysql_error());

taka mała uwaga...
chyba powinno być...

mysql_query($sql) or die(mysql_error());

??

0
Zawadzki14 napisał(a)

taka mała uwaga...
chyba powinno być...

Notatka: The die() function is an alias for exit().

0

Wiesz co ja mam taki kodzik:

header("Content-Type: application/octet-stream";
header("Content-Disposition: attachment; filename=$Name");
header("Content-Length: $FileSize;");

I na FF, operze dziala bez problemow na IE z teog co teraz zauwazylem zmienia nazwe ale plik otwiera sie bez problemow. A jak masz zapiasny MIME to mozesz go uzyc zamiast application/octet-stream.

A i polecal bym dodac exit po zakonczeniu wysylania, bo moze sie okazac ze skrypt zapisuje do pliku troche html'a czy innych niechcianych rzeczy

Powodzenia

1 użytkowników online, w tym zalogowanych: 0, gości: 1