Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Problem z headerem i pobieraniem plików
Forum PHP.pl > Forum > Przedszkole
MateuszS
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ąd

Niestety, 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:
  1. if(!empty($wynik["haslo"])) {
  2. $wpisane = strip_tags(str_replace(' ','', $_POST["haslo"]));
  3. if(!empty($wpisane)) {
  4. if($haslo == $wpisane) {
  5. echo "Pobieranie pliku rozpoczęte... ";
  6. header('Content-Type: application/x-unknown');
  7. header('Content-Description: File Transfer');
  8. header('Content-Disposition: attachment; filename='.$wynik["sciezka"]);
  9. header('Content-Transfer-Encoding: binary');
  10. // header("Location: ".$wynik["sciezka"]);
  11. } else {
  12. echo "Błąd: Hasło niepoprawne";
  13. }
  14. } else {
  15. echo "Błąd: Wpisz hasło do pliku.";
  16. }
  17. } else {
  18. echo "Pobieranie pliku rozpoczęte... ";
  19.  
  20. header('Content-Type: application/x-unknown');
  21. header('Content-Description: File Transfer');
  22. header('Content-Disposition: attachment; filename='.$wynik["sciezka"]);
  23. header('Content-Transfer-Encoding: binary');
  24. // header("Location: ".$wynik["sciezka"]);
  25. }


Kolejność headerów chyba jest dobra
evolucja
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
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
b4x
  1. $filename = '/home/bleble/a.rar';
  2. $file = fopen($filename, 'rb');
  3.  
  4. // Wrzuć Nagłowki tutaj
  5.  
  6. while (ob_get_level())
  7. {
  8. }
  9.  
  10.  
  11. // Bloki po 16kb
  12. $block = 1024 * 16;
  13.  
  14. while ( ! feof($file))
  15. {
  16. break;
  17. echo fread($file, $block);
  18.  
  19. flush();
  20. }
  21.  
  22. fclose($file);
  23.  
MateuszS
Niestety, treść np. pliku .txt wyświetla mi na stronie zamiast rozp. pobieranie.
pedro84
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 smile.gif

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
Niestety, pedro84 - nie działa. Próbowałem tak:

  1. echo "Pobieranie pliku rozpoczęte... ";
  2. header('Content-Type: application/x-unknown');
  3. header('Content-Description: File Transfer');
  4. header('Content-Disposition: attachment; filename='.$wynik["nazwa"]);
  5. header('Content-Transfer-Encoding: binary');


jak i tak

  1. $otworz = opendir("pliki/".$wynik["folder"]);
  2. echo "Pobieranie pliku rozpoczęte... ";
  3. header('Content-Type: application/x-unknown');
  4. header('Content-Description: File Transfer');
  5. header('Content-Disposition: attachment; filename=tomnet.txt');
  6. header('Content-Transfer-Encoding: binary');


Pobiera mi źródło strony do pliku txt ;/
pedro84
Co Ci zwraca var_dump($wynik["nazwa"]); ?
MateuszS
nazwę z rozszerzeniem np. tomnet.txt ;P zmienne są wporządku bo jak daje header("Location:".$wynik["sciezka"]); to ladnie smiga ;P
pedro84
Ale to niemożliwe biggrin.gif

Wrzuć gdzieś na www ten plik jako php i txt. Mam dokładnie ten sam kod u siebie i mi śmiga.
MateuszS
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
Eeeee, Mateusz.... nie chcę Cię załamywać, ale....sam zobacz... (pozwoliłem sobie skorzystać do wrzucenia tego pliku).

Jaką masz przeglądarkę?
MateuszS
Firefox. Pobrało mi 2 kb, nie można otworzyć obrazka, taki czerwony x się pojawia, tak jakbym otwierał pusty obrazek.
pedro84
Sprawdź teraz, powinno działac.

  1. <?php
  2.  
  3. $wynik["nazwa"] = 'test.rar';
  4.  
  5. echo "Pobieranie pliku rozpoczęte... ";
  6. header('Content-Type: application/x-unknown');
  7. header('Content-Description: File Transfer');
  8. header('Content-Disposition: attachment; filename='.$wynik["nazwa"]);
  9. header('Content-Transfer-Encoding: binary');
  10. header('Content-length: ' . @filesize($wynik["nazwa"]));
  11. @readfile($wynik["nazwa"]);
  12. ?>
MateuszS
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.
b4x
  1. <?php
  2.  
  3. $wynik["nazwa"] = 'test.rar';
  4. $filesize = filesize($wynik["nazwa"]);
  5.  
  6.  
  7. header('Content-Type: application/octet-stream');
  8. header('Content-Disposition: attachment; filename="'.basename($wynik["nazwa"]).'"');
  9. header('Content-Transfer-Encoding: binary');
  10. header('Content-Length: '.sprintf('%d', $filesize));
  11. header('Expires: 0');
  12. header('Pragma: no-cache');
  13.  
  14.  
  15. @readfile($wynik["nazwa"]);
  16. ?>
MateuszS
b4x, niestety to samo, możecie sprawdzić jak to wygląda tu
pedro84
Dalej to samo, możesz sprawdzić tutaj. Najlepsze, że wrzuciłem PSD 2.27 MB a pobiera się 2.28 MB biggrin.gif
MateuszS
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
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
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
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
Ten plik includuje do index.php gdzie mam na pocz. ob_start() i na koncu ob_end_flush();

  1. <?php
  2.  
  3. $zapytanie = mysql_query("SELECT * FROM `fu2_pliki` WHERE `hash_link`='".$_GET["l"]."'") or die(mysql_error());
  4.  
  5. if(mysql_num_rows($zapytanie) == 0) {
  6. exit("Błąd: Nie ma pliku o podanym linku");
  7. }
  8.  
  9. $wynik = mysql_fetch_assoc($zapytanie);
  10. $zapytanie2 = mysql_query("SELECT * FROM `fu2_rozszerzenia` WHERE `id`='".$wynik["rozszerzenie"]."'") or die(mysql_error());
  11. $rozszerzenie = mysql_fetch_assoc($zapytanie2);
  12. $haslo = $wynik["haslo"];
  13. if($wynik["rozmiar"] == 0) $wynik["rozmiar"]=0.01;
  14. if(!isset($_POST["send"])) {
  15. echo "<form name='lol' action='' method='POST'>";
  16. echo "Pobieranie pliku <span style='font-family: verdana; font-size: 10pt;'>".$wynik["nazwa"]."</span>";
  17. echo "<br /><br />";
  18. echo "<span style='font-size: 13pt;'>Nazwa pliku: </span><span style='font-family: verdana; font-size: 12pt; opacity: 0.85'>".$wynik["nazwa"]."</span><br />";
  19. echo "<span style='font-size: 13pt;'>Format: </span><span style='font-family: verdana; font-size: 12pt; opacity: 0.85'>".$rozszerzenie["rozszerzenie"]."</span><br />";
  20. 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 >";
  21.  
  22. if(!empty($wynik["email"]) or !empty($wynik["opis"])) {
  23. echo "<img src='images/szczegoly.png' id='29' /><br /><br />";
  24. }
  25. echo "<div class='box_5' style='display: none'>";
  26. if(!empty($wynik["email"])) {
  27. echo "Email autora <span style='font-family: verdana; font-size: 10pt; opacity: 0.85'>".$wynik["email"]."</span><br />";
  28. }
  29. if(!empty($wynik["opis"])) {
  30. echo "Opis: <span style='font-family: verdana; font-size: 10pt; opacity: 0.85'>".$wynik["opis"]."</span><br />";
  31. }
  32. echo "</div>";
  33. echo "<input type='hidden' value='1' name='send' />";
  34. echo "<br />";
  35. if(!empty($wynik["haslo"])) {
  36. echo "Podaj hasło do pliku: <br /><input type='password' name='haslo' style='opacity: 0.85; width: 155px; background-color: silver' /><br /><br />";
  37. }
  38. echo "<img src='images/pobierz.png' id='30' onClick='document.lol.submit();' style='opacity: 0.7' onMouseOver='opacity_in(30)' onMouseOut='opacity_dis(30)' />";
  39. echo "</form>";
  40. } else {
  41. //$otworz = opendir("pliki/".$wynik["folder"]);
  42. if(!empty($wynik["haslo"])) {
  43. $wpisane = strip_tags(str_replace(' ','', $_POST["haslo"]));
  44. if(!empty($wpisane)) {
  45. if($haslo == $wpisane) {
  46.  
  47. $filesize = filesize($wynik["sciezka"]);
  48.  
  49.  
  50. header('Content-Type: application/octet-stream');
  51. header('Content-Disposition: attachment; filename="'.basename($wynik["sciezka"]).'"');
  52. header('Content-Transfer-Encoding: binary');
  53. header('Content-Length: '.sprintf('%d', $filesize));
  54. header('Expires: 0');
  55. header('Pragma: no-cache');
  56.  
  57.  
  58. @readfile($wynik["sciezka"]);
  59.  
  60.  
  61. } else {
  62. echo "Błąd: Hasło niepoprawne";
  63. }
  64. } else {
  65. echo "Błąd: Wpisz hasło do pliku.";
  66. }
  67. } else {
  68.  
  69. $filesize = filesize($wynik["sciezka"]);
  70.  
  71. header('Content-Type: application/octet-stream');
  72. header('Content-Disposition: attachment; filename="'.basename($wynik["sciezka"]).'"');
  73. header('Content-Transfer-Encoding: binary');
  74. header('Content-Length: '.sprintf('%d', $filesize));
  75. header('Expires: 0');
  76. header('Pragma: no-cache');
  77.  
  78.  
  79. @readfile($wynik["sciezka"]);
  80.  
  81.  
  82. }
  83. }
  84. ?>
  85.  


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
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
Plik z indexem jest w moim poscie wczesniej. (gdzies na poprzedniej stronie)
b4x
  1. <?php
  2.  
  3. $wynik["nazwa"] = 'test.rar';
  4. $filesize = filesize($wynik["nazwa"]);
  5.  
  6.  
  7. header('Content-Type: application/octet-stream');
  8. header('Content-Disposition: attachment; filename="'.basename($wynik["nazwa"]).'"');
  9. header('Content-Transfer-Encoding: binary');
  10. header('Content-Length: '.sprintf('%d', $filesize));
  11. header('Expires: 0');
  12. header('Pragma: no-cache');
  13.  
  14. while (ob_get_level() > 0) {
  15. }
  16.  
  17. @readfile($wynik["nazwa"]);
  18.  
  19. exit(); // Zakończ działanie skryptu
  20. ?>
MateuszS
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
b4x
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
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
b4x
Nie koniecznie download.php chce pobrać, pewno chce pobrać plik ale pod nazwą download.php, bym sprawdził na Twoim miejscu poprawność:

  1. header('Content-Disposition: attachment; filename="'.$wynik["sciezka"].'"');
MateuszS
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.
Invision Power Board © 2001-2025 Invision Power Services, Inc.