TGViewer
Glo Academy Glo Academy @glo_academy · 3.76K subscribers
Post #2740 193
⚡ Прогресс загрузки файла на fetch без XHR

await fetch(url) возвращается, как только пришли заголовки. Тело ещё качается, и его можно читать по кускам через response.body.

const res = await fetch(url);
const total = +res.headers.get('Content-Length');
const reader = res.body.getReader();
const chunks = [];
let loaded = 0;
while (true) {
const { done, value } = await reader.read();
if (done) break;
chunks.push(value);
loaded += value.length;
progress.value = loaded / total;
}


Каждый reader.read() приносит следующий кусок: складываешь длины, делишь на размер файла из Content-Length и двигаешь полосу загрузки. Так умеют Chrome с 43-й версии, Firefox с 65-й и Safari с 10.1.

Если сервер сжимает ответ, в Content-Length окажется размер сжатого файла, а reader отдаёт распакованные байты, и прогресс уедет за 100%. Заголовка может и не быть, тогда показывай, сколько мегабайт уже скачано. Прогресс отправки так не посчитать, для неё по-прежнему берут XHR.

🔥 — если было полезно

@glo_academy | #js_day
  • 🔥 7
More from @glo_academy
  1. Oct 8, 2026🦜 @glo_academy
  2. Oct 5, 2026🎨 Тултип у края экрана переворачивается без JS Тултип над кнопкой обычно ставят через pos…
  3. Oct 2, 2026🧰 svgo Экспортируешь иконку колокольчика из графического редактора, а файл весит почти 2…
  4. Oct 1, 2026🤳 @glo_academy
  5. Sep 29, 2026✂️ Шрифт как в нативном приложении без загрузки файлов Подключаешь красивый шрифт с сервер…
  6. Sep 28, 2026🎨 Звёздочка у обязательного поля озвучится словами Ставишь звёздочку у обязательного поля…
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →