MateuszS
23.01.2010, 11:51:19
Chciałem aby na moim prywatnym hostingu po naciśnięciu odpowiedniego inputa pobierało pliki na komputer a nie wyświetlało je (grafika i tekstowe), więc zastosowałem rzekomo dobre rozwiązanie:
Z tądNiestety, mimo licznych kombinacji to nie działa, po kliknięciu na button następuje próba pobrania pliku o tej nazwie jednak zajmuje on po kilka kb i nie można go otworzyć. Ścieżka do pliku jest dobra bo po zwykłym header("Location: $sciezka"); dziala, jednak jak już pisałem, chodzi mi o rozwiązanie wykluczające otwieranie niektórych rozszerzeń plików w oknie przeglądarki
Oto kod:
if(!empty($wynik["haslo"])) { if($haslo == $wpisane) {
echo "Pobieranie pliku rozpoczęte... "; header('Content-Type: application/x-unknown'); header('Content-Description: File Transfer'); header('Content-Disposition: attachment; filename='.$wynik["sciezka"]); header('Content-Transfer-Encoding: binary'); // header("Location: ".$wynik["sciezka"]);
} else {
echo "Błąd: Hasło niepoprawne"; }
} else {
echo "Błąd: Wpisz hasło do pliku."; }
} else {
echo "Pobieranie pliku rozpoczęte... ";
header('Content-Type: application/x-unknown'); header('Content-Description: File Transfer'); header('Content-Disposition: attachment; filename='.$wynik["sciezka"]); header('Content-Transfer-Encoding: binary'); // header("Location: ".$wynik["sciezka"]);
}
Kolejność headerów chyba jest dobra
evolucja
23.01.2010, 14:42:09
Cytat
Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP.
To taki błąd na pierwszy rzut oka... popraw to.
MateuszS
23.01.2010, 15:08:56
niekoniecznie, wystarczy na poczatku dac ob_start(); a na koncu ob_end_flush(); i wszystko działa. Jak już pisałem zwykły header location: (przekierowanie) działa OK ale ja chcę zrobić trochę inaczej, jak pisałem wcześniej, (żeby plik np. .txt pobierał się na dysk a nie otwierał w przeglądarce
$filename = '/home/bleble/a.rar';
$file = fopen($filename, 'rb');
// Wrzuć Nagłowki tutaj
{
}
// Bloki po 16kb
$block = 1024 * 16;
{
break;
}
MateuszS
23.01.2010, 16:53:15
Niestety, treść np. pliku .txt wyświetla mi na stronie zamiast rozp. pobieranie.
pedro84
23.01.2010, 17:17:06
Mateusz, spróbuj tego, mi działa, dla pewności wszystkie porzeglądarki sprawdziłem. Oczywiście, file.txt to ścieżka (względnia nazwa pliku) do Twojego pliku

Kod
ob_start();
echo "Pobieranie pliku rozpoczęte... ";
header('Content-Type: application/x-unknown');
header('Content-Description: File Transfer');
header('Content-Disposition: attachment; filename=file.txt');
header('Content-Transfer-Encoding: binary');
ob_end_flush();
Daj znać, czy Ci działa.
MateuszS
23.01.2010, 18:09:02
Niestety, pedro84 - nie działa. Próbowałem tak:
echo "Pobieranie pliku rozpoczęte... "; header('Content-Type: application/x-unknown'); header('Content-Description: File Transfer'); header('Content-Disposition: attachment; filename='.$wynik["nazwa"]); header('Content-Transfer-Encoding: binary');
jak i tak
$otworz = opendir("pliki/".$wynik["folder"]); echo "Pobieranie pliku rozpoczęte... "; header('Content-Type: application/x-unknown'); header('Content-Description: File Transfer'); header('Content-Disposition: attachment; filename=tomnet.txt'); header('Content-Transfer-Encoding: binary');
Pobiera mi źródło strony do pliku txt ;/
pedro84
23.01.2010, 18:13:31
Co Ci zwraca var_dump($wynik["nazwa"]); ?
MateuszS
23.01.2010, 18:23:16
nazwę z rozszerzeniem np. tomnet.txt ;P zmienne są wporządku bo jak daje header("Location:".$wynik["sciezka"]); to ladnie smiga ;P
pedro84
23.01.2010, 18:25:14
Ale to niemożliwe

Wrzuć gdzieś na www ten plik jako php i txt. Mam dokładnie ten sam kod u siebie i mi śmiga.
MateuszS
23.01.2010, 18:35:07
Oto strona na której możesz zobaczyć co jest nie tak. Spróbuj upnąć i pobrać jakiś plik np. txt
http://mateuszs.pl/uploader2/http://wklejto.pl/55202 - plik odpowiedzialny za pobieranie
http://wklejto.pl/55203 - index.php
pedro84
23.01.2010, 19:11:49
Eeeee, Mateusz.... nie chcę Cię załamywać, ale....
sam zobacz... (pozwoliłem sobie skorzystać do wrzucenia tego pliku).
Jaką masz przeglądarkę?
MateuszS
23.01.2010, 19:21:36
Firefox. Pobrało mi 2 kb, nie można otworzyć obrazka, taki czerwony x się pojawia, tak jakbym otwierał pusty obrazek.
pedro84
23.01.2010, 19:32:06
Sprawdź teraz, powinno działac.
<?php
$wynik["nazwa"] = 'test.rar';
echo "Pobieranie pliku rozpoczęte... "; header('Content-Type: application/x-unknown'); header('Content-Description: File Transfer'); header('Content-Disposition: attachment; filename='.$wynik["nazwa"]); header('Content-Transfer-Encoding: binary'); ?>
MateuszS
23.01.2010, 19:43:10
juz cieplej. Niestety przy np pobieraniu archiwum, pobiera całe ale przy wypakowaniu nieoczekiwany koniec archiwum. Przy .exe pobiera cały ale jest inna ikonka i nie da się otworzyć pliku.
<?php
$wynik["nazwa"] = 'test.rar';
header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($wynik["nazwa"]).'"'); header('Content-Transfer-Encoding: binary');
?>
MateuszS
24.01.2010, 11:06:31
b4x, niestety to samo, możecie sprawdzić jak to wygląda
tu
pedro84
24.01.2010, 13:40:23
Dalej to samo, możesz sprawdzić
tutaj. Najlepsze, że wrzuciłem PSD 2.27 MB a pobiera się 2.28 MB
MateuszS
24.01.2010, 13:49:01
No właśnie wiem że to samo ;D Nie wiem czemu, podmieniłem jak napisał b4x, reszte kodu macie w poprzednich postach i dalej lipa.. może to być wina serwera?
pedro84
24.01.2010, 15:57:29
Kod, który napisał Ci b4x musi działać, przynajmniej mi działa, cholera wie, może faktycznie coś z konfiguracja systemu, nie mam pomysłu niestety żadnego, może spróbuj na innym serwerze/localu?
MateuszS
24.01.2010, 17:01:42
A no właśnie... przecież na localu też nie działa ;/ Może coś jest nie tak z resztą kodu...
PS ale wam też to nie działa na mojej stronie nie?
pedro84
24.01.2010, 17:27:53
Cytat(MateuszScirka @ 24.01.2010, 17:01:42 )

A no właśnie... przecież na localu też nie działa ;/ Może coś jest nie tak z resztą kodu...
PS ale wam też to nie działa na mojej stronie nie?
Na Twojej stronie nie działa, ale na localu mi działa. Hmm... Faktycznie musisz mieć coś nie tak z innym kodem.
MateuszS
24.01.2010, 17:41:19
Ten plik includuje do index.php gdzie mam na pocz. ob_start() i na koncu ob_end_flush();
<?php
exit("Błąd: Nie ma pliku o podanym linku"); }
$haslo = $wynik["haslo"];
if($wynik["rozmiar"] == 0) $wynik["rozmiar"]=0.01;
if(!isset($_POST["send"])) { echo "<form name='lol' action='' method='POST'>"; echo "Pobieranie pliku <span style='font-family: verdana; font-size: 10pt;'>".$wynik["nazwa"]."</span>"; echo "<span style='font-size: 13pt;'>Nazwa pliku: </span><span style='font-family: verdana; font-size: 12pt; opacity: 0.85'>".$wynik["nazwa"]."</span><br />"; echo "<span style='font-size: 13pt;'>Format: </span><span style='font-family: verdana; font-size: 12pt; opacity: 0.85'>".$rozszerzenie["rozszerzenie"]."</span><br />"; echo "<span style='font-size: 13pt;'>Rozmiar: </span><span style='font-family: verdana; font-size: 12pt; opacity: 0.85'>".$wynik["rozmiar"]." Mb</span><br /><br >";
if(!empty($wynik["email"]) or
!empty($wynik["opis"])) { echo "<img src='images/szczegoly.png' id='29' /><br /><br />"; }
echo "<div class='box_5' style='display: none'>"; if(!empty($wynik["email"])) { echo "Email autora <span style='font-family: verdana; font-size: 10pt; opacity: 0.85'>".$wynik["email"]."</span><br />"; }
if(!empty($wynik["opis"])) { echo "Opis: <span style='font-family: verdana; font-size: 10pt; opacity: 0.85'>".$wynik["opis"]."</span><br />"; }
echo "<input type='hidden' value='1' name='send' />"; if(!empty($wynik["haslo"])) { echo "Podaj hasło do pliku: <br /><input type='password' name='haslo' style='opacity: 0.85; width: 155px; background-color: silver' /><br /><br />"; }
echo "<img src='images/pobierz.png' id='30' onClick='document.lol.submit();' style='opacity: 0.7' onMouseOver='opacity_in(30)' onMouseOut='opacity_dis(30)' />"; } else {
//$otworz = opendir("pliki/".$wynik["folder"]);
if(!empty($wynik["haslo"])) { if($haslo == $wpisane) {
$filesize = filesize($wynik["sciezka"]);
header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($wynik["sciezka"]).'"'); header('Content-Transfer-Encoding: binary');
} else {
echo "Błąd: Hasło niepoprawne"; }
} else {
echo "Błąd: Wpisz hasło do pliku."; }
} else {
$filesize = filesize($wynik["sciezka"]);
header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($wynik["sciezka"]).'"'); header('Content-Transfer-Encoding: binary');
}
}
?>
Nie wydaje mi sie zeby cos tu przeszkadzalo w pobraniu pliku. Goły, sam skrypt na localu tez mi dziala ale w polaczeniu ze strona cos jest nie tak ;/ ;/
pedro84
24.01.2010, 18:00:37
Ale może w pliku index.php coś jest nie tak? Nie wiem. Trudno powiedzieć. Może wrzuć gdzieś jakąś paczkę do zobaczenia, tam gdzie będzie index.php.
MateuszS
24.01.2010, 19:26:49
Plik z indexem jest w moim poscie wczesniej. (gdzies na poprzedniej stronie)
<?php
$wynik["nazwa"] = 'test.rar';
header('Content-Type: application/octet-stream'); header('Content-Disposition: attachment; filename="'.basename($wynik["nazwa"]).'"'); header('Content-Transfer-Encoding: binary');
}
exit(); // Zakończ działanie skryptu ?>
MateuszS
24.01.2010, 20:09:46
b4x, niestety dalej to samo, problem gdzieś jest pewnie w indexie... w sumie nie widze tam nic nadzwyczajnego co moglo by psuć mi skrypt. Może jest jakieś alternatywne rozw. np. Ajaxowe
Ja na Twoim miejscu pobieranie zrobiłbym w osobnym plik - bez żadnego HTML'a itd.
Po prostu - np. plik download.php - pobierasz ID pliku GET'em, sprawdzasz czy plik istnieje (tak jak masz to teraz) i wysyłasz.
MateuszS
24.01.2010, 21:09:13
Mysle ze wystarczy, dzięki wam obu
Tylko jest jeden problem. Na localhoscie dziala a na serwerze chce mi pobierac plik download.php zamiast pliku docelowego oO
Nie koniecznie download.php chce pobrać, pewno chce pobrać plik ale pod nazwą download.php, bym sprawdził na Twoim miejscu poprawność:
header('Content-Disposition: attachment; filename="'.$wynik["sciezka"].'"');
MateuszS
24.01.2010, 21:12:47
Ok już działa wszystko. Dzięki jeszcze raz.
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.