Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: Streaming pliku z zewnetrznego serwera do uzytkownika
Forum PHP.pl > Forum > PHP
piodof
Witam,

Mam nastepujacy problem. Chcialbym zrobic tak aby uzytkownik mogl pobrac plik z serwera, ktory w tym czasie jest jeszcze zapisywany.

  1. if ( !isset($_GET['downloadtodisk']) && !isset($_GET['uploadtouser']) ) {
  2.  
  3. $c = curl_init() ;
  4. curl_setopt($c, CURLOPT_URL, 'download.php?downloadtodisk=1') ;
  5. curl_setopt($c, CURLOPT_TIMEOUT, 5) ;
  6. curl_exec($c);
  7. curl_close($c);
  8. header('Location:download.php?uploadtouser=1') ;
  9. }
  10. else if ( isset($_GET['downloadtodisk']) ) {
  11.  
  12. $fp = fopen ('plik.mp3', 'w+') ;
  13. $ch = curl_init('http://www.jakasdomena.com/url_pliku_mp3') ;
  14. curl_setopt($ch, CURLOPT_FILE, $fp) ;
  15. curl_setopt($ch, CURLOPT_FOLLOWLOCATION, true);
  16. curl_exec($ch);
  17. curl_close($ch);
  18. }
  19. else if ( isset($_GET['uploadtouser']) ) {
  20.  
  21. header("Content-type: application/unknown") ;
  22. header("Content-Transfer-Encoding: Binary") ;
  23. header("Content-length: ROZMIAR_PLIKU") ;
  24. header("Cache-Control: must-revalidate, post-check=0, pre-check=0") ;
  25. header("Content-disposition: attachment; filename=\"".'plik.mp3'."\"") ;
  26.  
  27. readfile('plik.mp3') ;
  28. }


Chodzi o to, ze serwer ma szybsze polaczenie internetowe niz uzytkownik. Chcialbym to wykorzystac w taki sposob aby w momencie pobierania pliku z zewnetrznego serwera, uzytkownik mogl juz w tym czasie pobierac ten plik na swoj dysk. Musi sie to odbyc na zasadzie wyskakujacego okna dialogowego z pytaniem o lokalizacje zapisania pliku. Chodzi mi o taki streaming, ktory umozliwil by pobieranie jeszcze nie dokonczonego pliku. Czy da sie w ogole cos takiego zrobic?
maniana
Chyba się nie da (przynajmniej przez przeglądarkę), bo:
- nie wiesz ile wysyłasz (długość pobieranych danych)
- przeglądarka nie jest w stanie kontynuować przerwanego pobierania
- nie dokończony plik ma nie zamknięty uchwyt i nie jest dostępny dla innych

Co mi przychodzi do głowy to jakieś kombinacje z 'paczkowaniem' danych. Zapisujesz x tam danych, wysyłasz tą część pliku... itd itd...
Ale jak to wyjdzie w rzeczywistości to nie wiem..
kiler129
To jest jak najbardziej możliwe ale muszą być zachowane pewne warunki:

1. Limiter prędkości wysyłania na 70% możliwości downloadu
2. Brak content-length w odpowiedzi
3. Odpowiedź z nagłówiek Connection:close

Musisz w osobnym wątku pobierać, w osobnym wysyłać. Robisz to przez fsockopen i fread z małym chunkiem (max 16KB).
W tak zaprojektowanym skrypcie przeglądarka pozwoli na pobranie pliku który będzie miał rozmiar wynikowy questionmark.gif?KB i będzie się pobierał do zerwania połączenia czyli zakończenia pliku LUB urwania połączenia, toteż wznowienie raczej nie będzie możliwe.
wookieb
A tam z ciekawości zapytam. Czy MOD_STREAM w apache wystarczyłby do takiego zadania?
piodof
Dzieki za pomoc. To wszystko trzyma sie kupy.

Kiler129, czy moglbys napisac tak na szybko jakis maly przyklad. Troche sie gubie w tym pobieraniu i wysylaniu.
kiler129
Cytat(wookieb @ 22.10.2010, 08:49:42 ) *
A tam z ciekawości zapytam. Czy MOD_STREAM w apache wystarczyłby do takiego zadania?

Jest to pewne rozwiązanie ale to zaprzątanie koparki do nasypania wiaderka piasku.

@up - naskrobie ci coś jak wrócę do domu. Dodatkowo co wpadło mi do głowy aby uniknąć zrywania połączenia jeśli plik nie zdąży się ściągnąć na serwer a user go już pobierze - można sprawdzać czy plik jest zablokowany do zapisu - jeśli jest to nie zrywam połączenia do usera tylko czekam.
piodof
Cytat(kiler129 @ 22.10.2010, 13:28:22 ) *
Jest to pewne rozwiązanie ale to zaprzątanie koparki do nasypania wiaderka piasku.

@up - naskrobie ci coś jak wrócę do domu. Dodatkowo co wpadło mi do głowy aby uniknąć zrywania połączenia jeśli plik nie zdąży się ściągnąć na serwer a user go już pobierze - można sprawdzać czy plik jest zablokowany do zapisu - jeśli jest to nie zrywam połączenia do usera tylko czekam.


Probuje caly czas to jakos zrobic ale bez skutku. Albo sciagam plik ważący 160 KB albo skrypt sie zawiesza. Probowalem wykorzystac limity predkosci na zasadzie sleep() i flush() ale w ogole to u mnie nie dziala (albo cos zle robie). Do pliku zapisuje mi bardzo fajnie ale z udostepnieniem mam ogromne problemy. Jesli masz chwile to daj mi prosze chociaz zarys tego co musze zrobic, bo juz normalnie wymiekam z tym skryptem.


-------------------------------------------------------------------------------------------------------------------------------------
-------------------------------------------------------------------------------------------------------------------------------------


Udalo mi sie wreszcie napisac ten skrypt. Dziekuje wszystkim za pomoc. Jutro wrzuce gotowa klase.
kiler129
Miałem ci właśnie napisać smile.gif
Sleep i flush to kiepski pomysł - lepiej użyć usleep i co każdy pakiet limitować.
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.