概述If-Range 可在资源未变更时返回 206 分块内容,否则返回 200 全量。本文给出端到端协作示例。获取 ETag 并续传async function getEtag(url) { const res = await fetch(url, { method: 'HEAD' }); return res.headers.get('ETag'); } async function fetchRange(url, start, size, etag) { const end = start + size - 1; const headers = { Range: `bytes=${start}-${end}` }; if (etag) headers['If-Range'] = etag; const res = await fetch(url, { headers }); const buf = await res.arrayBuffer(); return { status: res.status, bytes: new Uint8Array(buf) }; } 处理 200/206async function resume(url, offset, size) { const etag = await getEtag(url); const { status, bytes } = await fetchRange(url, offset, size, etag); if (status === 206) return { resumed: true, bytes }; if (status === 200) return { resumed: false, bytes }; // 资源变更,回退全量 throw new Error('unexpected status'); }

发表评论 取消回复