Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP]Pobieranie pliku na serwer i wysyłanie go 'w locie użytkownikowi'
Forum PHP.pl > Forum > Przedszkole
Greg23
Witam, chciałem stworzyć serwer pośredniczący w pobieraniu plików z sieci.
Problem jest taki, że aby umożliwić użytkownikowi pobranie danego zasobu, musi on zostać
całkowicie pobrany na serwer.

Ja chciałbym to tak zrobić, żeby użytkownik mógł rozpocząć pobieranie pliku, który jest dopiero pobierany na serwer.
Zrobiłem test i jeśli plik na serwer nie został pobrany w 100% a użytkownik próbuje go pobrać z tego serwera to pobiera tylko tą część, któa w tym momencie jest na serwerze.
Czy da się to zrobić tak, żeby user mógł pobrać w całości plik, który jest dopiero zapisywany na serwerze ?
Niktoś
Cytat
Czy da się to zrobić tak, żeby user mógł pobrać w całości plik, który jest dopiero zapisywany na serwerze ?

No a niby jak?Z pustego i Salomon nie naleje.To tak jakbyś chciał zobaczyć wynik meczu który jest strimingowany on-live.
Greg23
No właśnie nie wiem.
Nie jest puste, bo na serwerze jest już plik tylko nie cały i można go wysyłać, tylko pobiera się ta część, któa aktualnie jest na serwerze, ale gdyby
podać błędny rozmiar pliku (jakby był cały pobrany) to chyba by poszło, tylko jak to zrobić ?
Niktoś
Cytat
ale gdyby
podać błędny rozmiar pliku


To dostaniesz w rezultacie błędny plik.
!*!
Nie można. Za bardzo kombinujesz. Wgraj plik na serwer i wtedy go udostępnij, do pobierania.
Greg23
Jednak oni jakoś to robią:
http://dloader.pl/

Podając ścieżkę, do kilkuset megowego pliku pobieranie rozpoczyna się prawie że od razu z serwera pośredniczącego.
Czyli mimo iż plik nie został całkowicie pobrany na serwer (bo w mgnieniu oka ten serwis nie pobierze takiego pliku) zostaje on wysyłany do użytkownika.
Więc jednak się da :]
!*!
Ten serwis pobiera pliki bezpośrednio z serwera, a nie w locie. Przecież filmy nie są wgrywane cały czas od kogoś z komputera.
Greg23
Jak to bezpośrednio ?
Pliki wysyłane są z serwera dload.pl, więc plik jest pobierany najpierw na dload (z zewnątrz) a potem wysyłany do użytkownika,
nie jest pobierany bezpośrednio z zewnętrznego serwera.
Niktoś
To jest strimingowanie.Plik pobierany na serwerze musi być zawsze większy od pliku ,który użytkownik aktualnie pobiera.Kiedy użytkownik pobiera krytyczną ilość danych a serwer wciąż pobiera plik to proces dawnloadu u użytkownika zostaje zatrzymany i ponownie wznowiony, kiedy serwer uploaduje dostateczną ilość danych żeby mógł ją przesłać.Efekt jest taki ,że użytkownikowi wydaje się jakby ciągle pobierał dane, a w cale tak nie jest.
Greg23
Więc w jaki sposób streamingować użytkownikowi plik, który aktualne jest pobierany na serwer ?
Niktoś
Chyba najłatwiej byłoby to zrobić na socketach. Popatrz na biblioteki node.js.
Greg23
Byłbyś w stanie coś takiego zrobić ?
Niktoś
Raczej nie, ja programuje w c# net. Ale pewnie są tacy co by umieli.

Wynik tej funkcji należałoby przesłać po sockecie
Cytat
function fwrite_stream($fp, $string) {
for ($written = 0; $written < strlen($string); $written += $fwrite) {
$fwrite = fwrite($fp, substr($string, $written));
if ($fwrite === false) {
return $written;
}
}
return $written;
}
?>

Utworzyć :
Cytat
stream.setEncoding('utf8');
stream.addListener($written, function (line) {
// Pausowanie streamingu jeśli zachodziła by ku temu potrzeba
stream.pause();
// make async API call...
makeAPICall(line, function() {
// wznawianie streamingu
stream.resume();
});
})


To taki pseudokod-może ktoś to poprawi i rozwinie:)
Greg23
Wielkie dzięki za pomoc, spróbuje to jakoś ogarnąć :]
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.