Jak działają pobieranie z możliwością wstrzymania?

19

Używam Internet Download Managera (IDM) do pobierania danych i zauważyłem, że w oknie postępu pobierania pokazuje, czy pobieranie jest w stanie wstrzymać (czy wznowić). Zwykle witryny udostępniania plików nie pozwalają na wznowienie przesyłania, jeśli połączenie zostanie zerwane.

Pytanie zatem brzmi: jak to działa? Czy to jakaś konfiguracja wykonana na serwerze? Czym różni się to od pobierania torrentów, gdzie pobieranie jest zawsze możliwe do wznowienia.

Rafay
źródło

Odpowiedzi:

27

Z punktu widzenia kodowania pobieranie jest tylko tablicą bajtów zawartą w strumieniu odpowiedzi HTTP.

Protokół HTTP 1.1 (patrz strona 30) zawiera pole w nagłówku o nazwie „Zakres”, które pozwala żądaniu określić przesunięcie bajtu i długość żądanej odpowiedzi.

Zasadniczo możesz powiedzieć: „daj mi obiekt HTTP pod tym adresem URL, ale chcę tylko 1024–4096 bajtów”. Przeglądarka klienta dołącza strumień bajtów do części pliku, który został już pobrany. Klient może określić, gdzie należy wznowić, po prostu sprawdzając długość już pobranego pliku, i zwiększa go, aby określić wymagane przesunięcie.

Co do sposobu, w jaki twój menedżer pobierania może wysyłać, wysyła żądanie HTTP „HEAD”. Jeśli kod odpowiedzi to 206 (treść częściowa), wówczas strumień HTTP obsługuje wznawianie.

Frank Thomas
źródło
FTP jest również powszechnie stosowanym protokołem do przesyłania plików. Kiedyś był to podstawowy sposób, choć teraz HTTP jest prawdopodobnie bardziej powszechny.
ChrisInEdmonton
FTP używa zasadniczo tej samej konstrukcji, chociaż musiałbym sprawdzić szczegóły, zanim spróbuję zaimplementować kod, który z niego korzysta.
Frank Thomas
1

Można to rozwiązać za pomocą trwałego pliku cookie , nie należy go mylić z sesyjnym plikiem cookie lub można użyć [Viewstate], jeśli witryna jest zbudowana na platformie ASP.NET, jednak nie jest to dobra praktyka. Frank Thomas ma najlepszą odpowiedź.

Josh Campbell
źródło
1
Nie jestem pewien powodu, dla którego odpowiedź ta została odrzucona, więc ją poparłem.
Ramhound
@FrankThomas, właśnie potwierdziłem pewne fakty z naszym starszym programistą i powiedział, że „możesz” użyć trwałego pliku cookie lub stanu wyświetlania do przechowywania informacji o indeksie tablicy bajtów używanych do śledzenia i wznawiania pobierania za pomocą przeglądarki do pobierania, jednak nie było to dobra praktyka. Zazwyczaj w przypadku dużych plików do wznowienia, takich jak produkt MS, należy pobrać aplikację Menedżera pobierania i działałaby ona tak, jak powiedziałeś. Poparłem twoją odpowiedź.
Josh Campbell
Ta odpowiedź wydaje się bez znaczenia. Nie ma problemu z określeniem, ile części pliku zostało pobrane; klient już to wie. Możesz przekazać to z powrotem do serwera za pomocą pliku cookie, ale istnieją znacznie lepsze podejścia. Nagłówki, parametry GET lub POST itp. Pytanie dotyczy tego, w jaki sposób wznawia się przesyłanie pliku, a nie jak przekazać informacje do serwera.
ChrisInEdmonton
OP zapytał, jak to działa, i wskazałem mu kierunek plików cookie, aby mógł przeprowadzić dalsze badania. Istnieje kilkanaście różnych sposobów, w jakie deweloper może zrobić wznawiającego program do pobierania. Zrobiłbym to za pomocą plików cookie na kliencie, aby śledzić status pobierania za pomocą indeksu start-stop, i użyłem C # na zapleczu, aby obliczyć, ile zostało pobrane (od indeksu X do indeksu Y), a następnie wznowione od Y. Pobieranie na komputer Menedżer robi dokładnie to samo, tylko przechowuje informacje w pliku tekstowym lub bazie danych. To nie jest przepełnienie stosu, nie piszę kodu źródłowego.
Josh Campbell,
@JoshCampbell, problem polega na tym, że Twoje rozwiązanie będzie działać tylko dla osób korzystających z określonego oprogramowania klienckiego i serwera. Istnieją standardowe sposoby rozwiązania tego problemu, jak zauważa Frank w swojej odpowiedzi, i nie trzeba go kodować według własnego uznania. Ponadto twoja odpowiedź nie wskazuje procesu, w którym niektóre strony zezwalają PO na wznowienie pobierania, a więc nie odpowiada na pytanie. Dlatego skomentowałem.
ChrisInEdmonton