Greg23
23.07.2012, 16:36:07
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ś
23.07.2012, 16:46:39
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
23.07.2012, 16:51:15
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ś
23.07.2012, 16:53:01
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
23.07.2012, 16:57:59
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
23.07.2012, 17:02:48
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ś
23.07.2012, 17:06:00
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
23.07.2012, 17:09:05
Więc w jaki sposób streamingować użytkownikowi plik, który aktualne jest pobierany na serwer ?
Niktoś
23.07.2012, 17:21:00
Chyba najłatwiej byłoby to zrobić na socketach. Popatrz na biblioteki node.js.
Greg23
23.07.2012, 17:30:23
Byłbyś w stanie coś takiego zrobić ?
Niktoś
23.07.2012, 17:58:11
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
23.07.2012, 18:56:16
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.