To pytanie ma już odpowiedź tutaj:
Czasami podczas pobierania pliku w przeglądarce internetowej postęp pobierania nie „zna” całkowitego rozmiaru pliku ani tego, jak daleko jest w pobraniu - pokazuje tylko szybkość, z jaką jest pobierany, z ogółem jako „Nieznany”.
Dlaczego przeglądarka nie zna ostatecznego rozmiaru niektórych plików? Skąd ta informacja?
Odpowiedzi:
Do żądania dokumentów z serwerów WWW przeglądarki używają protokołu HTTP. Możesz znać tę nazwę z paska adresu (może być teraz ukryty, ale kiedy klikniesz pasek adresu, skopiuj adres URL i wklej go w edytorze tekstów, zobaczysz
http://
na początku). HTTP to prosty protokół tekstowy. Działa to tak:Po pierwsze, przeglądarka łączy się z serwerem witryny i wysyła adres URL dokumentu, który chce pobrać (strony internetowe też są dokumentami) oraz niektóre szczegóły dotyczące samej przeglądarki ( User-Agent itp.). Na przykład, aby załadować stronę główną na stronie SuperUser
http://superuser.com/
, moja przeglądarka wysyła żądanie, które wygląda następująco:Pierwszy wiersz określa, który dokument powinien zwrócić serwer. Pozostałe linie nazywane są nagłówkami; wyglądają tak:
Linie te wysyłają dodatkowe informacje, które pomagają serwerowi zdecydować, co robić.
Jeśli wszystko będzie w porządku, serwer odpowie, wysyłając żądany dokument. Odpowiedź zaczyna się od komunikatu o stanie, po którym następuje kilka nagłówków (ze szczegółami na temat dokumentu) i na koniec, jeśli wszystko jest w porządku, treść dokumentu. Tak wygląda odpowiedź serwera SuperUser na moje żądanie:
Po ostatniej linii serwer SuperUser zamyka połączenie.
Pierwszy wiersz (
HTTP/1.1 200 OK
) zawiera kod odpowiedzi , w tym przypadku jest to200 OK
. Oznacza to, że serwer zdecydował, że może zwrócić dokument zgodnie z żądaniem, i obiecuje, że następująca zawartość będzie takim dokumentem. Jeśli tak nie jest, kod będzie czymś innym i dostarczy pewnej wskazówki, dlaczego serwer nie tylko zwraca dokument jako odpowiedź: na przykład, jeśli nie może znaleźć żądanego dokumentu, powinien zwrócić404 Not Found
, a jeśli nie masz dostępu do danej treści, powinna ona powrócić403 Forbidden
.Po tej pierwszej linii statusu następują nagłówki odpowiedzi; dostarczają więcej informacji na temat zwracanej treści, na przykład jej
Content-type
.Dalej jest pusta linia. Sygnalizuje to, że nie będzie już żadnych nagłówków odpowiedzi. Wszystko poza tym wierszem stanowi treść żądanego dokumentu. Tak więc w powyższym przykładzie
<!DOCTYPE html>
jest pierwszy wiersz strony głównej SuperUser (dokument HTML). Gdybym prosił o dokument do pobrania, prawdopodobnie byłyby to bełkotliwe znaki, ponieważ większość formatów dokumentów jest nieczytelna bez wcześniejszego przetworzenia.Powrót do nagłówków. Najbardziej interesująca jest dla nas ostatni,
Content-Length
. Informuje przeglądarkę, ile bajtów danych powinno oczekiwać po pustym wierszu, więc w zasadzie jest to rozmiar dokumentu wyrażony w bajtach. Ten nagłówek nie jest obowiązkowy i może zostać pominięty przez serwer. Czasami nie można przewidzieć rozmiaru dokumentu (na przykład, gdy dokument jest generowany w locie), czasami leniwi programiści go nie uwzględniają (dość powszechne w witrynach pobierania sterowników), czasami strony internetowe są tworzone przez początkujących, którzy nie wiedzą takiego nagłówka.W każdym razie, bez względu na przyczynę, może brakować nagłówka. W takim przypadku przeglądarka nie wie, ile danych ma wysłać serwer, a zatem wyświetla rozmiar dokumentu jako nieznany , czekając na zakończenie połączenia przez serwer. I to jest powód nieznanych rozmiarów dokumentów.
źródło
Content-Length
Nagłówek HTTP jest w niektórych przypadkach opcjonalny i jako taki może nie zostać przesłany z plikiem; koniec pliku zostanie zasygnalizowany, gdy gniazdo zostanie zamknięte.źródło
Content-Length
używane jest pole nagłówka lub dokument jest przesyłanyTransfer-Encoding: chunked
. Ten ostatni umożliwia dynamiczne generowanie treści i wysyłanie jej fragmentarycznie w miarę generowania i jest w stanie zasygnalizować koniec dokumentu.Gdy treść (np.
.pdf
Dokument lub arkusz Excela) jest tworzona w locie, nie można wcześniej określić rozmiaru. W takich przypadkach serwer nie może wcześniej wysłać rozmiaru pobierania, a przeglądarka nie może wyświetlić całkowitego rozmiaru.źródło
.pdf
pliki w locie. Dopóki dane nie są poprawnie zapisane, nie znasz rozmiaru, ale możesz wysłać ata już do przeglądarki. Zrobiłem to już w Javie i wysłałem plik Excela do przeglądarki, który został wygenerowany w locie. Od strony przeglądarki wyglądało to na pobieranie, ale od strony serwerów jest to streaming. Możliwe jest więc przesyłanie strumieniowe.pdf
plików, nawet jeśli sobie tego nie wyobrażasz. Z przeglądarki wygląda jak pobieranie bez znanej długości..pdf
plik lub arkusz Excela!