Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [php] Force-Download
Forum PHP.pl > Forum > PHP
Black-Berry
Ostatnio zająłem się skryptem do ściągania plików. Testowałem tonę skryptów i za kazdym razem natrafiałem na problemy. Najbardyiej pryzjaynz okazał się ten:
  1. <?php
  2. $file = fopen('download/' . $_GET['content'], 'r');
  3. $fsize = filesize('download/' . $_GET['content']);
  4. header('Pragma: no-cache');
  5. header('Content-type: application/x-zip-compressed; name="' . $_GET['content'] . '"');
  6. header('Content-Disposition: attachment; filename="' . $_GET['content'] . '"');
  7. $fsize = filesize('download/' . $_GET['content']);
  8. header('Content-Length: ' . ($fsize));
  9. while (!feof($file)) {
  10. echo fread($file, 1024);
  11. }
  12. fclose($file);
  13. ?>

Niestety nie do końca... Na przykładzie tego pliku lista dziwnych błędów:
1. Firefox 3.0 zatrzymuje download na dłuższą chwilę przy 95%
2. IE7 nie pokazuje progress-bara
3. Opera 9.50 zatrzymuje się na chwilę przy 99% i p mimo tego, że plik się poprawnie sciąga na pasku postępu pokazuje "Błąd"

Może jest jakiś kod kończący wysyłanie pliku o którym nie wiem? Bardzo prosze o pomoc.
loganek
zawsze robiłem w ten sposób:
Kod
   Header("Content-disposition: attachment; filename=\"".$_GET["download"]."\"");
   Header("Content-type: application/force-download");
   readfile($_GET["download"]);

i działało
Black-Berry
Odkryłem, że bez tej linijki określającej wielkość pliku:

  1. <?php
  2. header('Content-Length: ' . ($fsize));
  3. ?>


działa poprawnie tzn. nie zatrzymuje się przy końcu. Dobrze by jednak było znać rozmiar pliku i przewidywany czas ściągnięcia :/
php programmer
wywal
  1. <?php
  2. header('Pragma: no-cache');
  3. ?>
Black-Berry
Nic to nie daje.

Coś chyba jednak mam źle w założeniach bo znalazłem następny problem:
-> Jeśli coś się sciąga to dana przeglądarka nie pozwala na przejście do innej strony z tego samego serwera.

Czemu takie coś zapycha całą sesję i już nic nie można zobić do końca ściągania ? Można coś z tym zrobić ?
batman
Wywal to: application/x-zip-compressed i dodaj odpowiedni nagłówek w zależności od rodzaju pliku. Jeśli nie wiadomo jaki rodzaj pliku to dajesz application/octet-stream. Powinno zadziałać.
Black-Berry
Udało mi się zrobić to tak żeby nie zwalniało przy 95%. W tym artykule jest opis.

Nie zmienia to jednak faktu, że force-download pżera całą sesję i w przypadku dużych plików musisz czekać aż się ściągnie żeby móc przejść na inną podstronę.
batman
Tego właśnie linka chciałem Ci wkleić, ale niestety nie działa u mnie.
Zerknij jeszcze na obsługę połączeń. Znajdziesz tam kilka ciekawych informacji na temat ściągania plików.
Black-Berry
Dzięk, ale jakoś nie mam pomysłu co mógłbym z tym zrobić... :/ Podczas ściągania pliku serwer nie obsługuje z danej sesji nic oprócz wysyłania go więc jeśli przerwę wysyłanie to całe ściąganie szlak trafi.

Edit:
Niezłe ostatnie zdanie mi wyszło ale mam nadzieję, że wiesz o co mi chodzi smile.gif
batman
No właśnie nie. W tym linku, o ile się nie mylę, opisana była metoda ściągania plików częściowych, np przy pomocy download managerów. Testowałem i działało bez zarzutu, a ściąganie uruchamiałem w osobnym oknie.
edit
Twoim linku
Black-Berry
Okazało się, że wszystko jest dobrze. Mam gdzieś błąd przy inkludowaniu zewnętrznej biblioteki. Po usunięciu jej wszystko zaczeł działać poprawnie.


Edit:
Okazuje się, że musi być osobna sesja utworzona specjalknie dla ściągania, żeby nie zablokowac obecnej... Jak w takim razie pobrać zmienne sesyjne questionmark.gif Nie mam pojęcia.

Edit2:
No i nie uwierzycie w czym był problem.... Nie wiem czy to moze błąd PHP czy luka w moim rozumowaniu ale żeby nie zakleszczyć sesji użytkownika to przed rozpoczęciem wysyłania należy wstawić :

  1. <?php
  2. ?>
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.