概览通过在 Route Handlers 中解析 `Range` 请求头,返回 `206 Partial Content` 与 `Content-Range`,可实现断点下载与续传。Edge Runtime 适合流式输出与低延迟传输。app/api/download/route.tsexport const runtime = 'edge'

const SIZE = 10 * 1024 * 1024 // 10MB 示例

export async function GET(req: Request) {

const range = req.headers.get('range')

let start = 0

let end = SIZE - 1

if (range) {

const m = /bytes=(\d+)-(\d+)?/.exec(range)

if (m) {

start = Number(m[1])

end = m[2] ? Number(m[2]) : Math.min(start + 1024 * 256 - 1, SIZE - 1) // 默认 256KB 分块

}

}

const chunkSize = end - start + 1

const stream = new ReadableStream({

start(controller) {

// 这里用随机字节模拟实际文件读取

const buf = new Uint8Array(chunkSize)

crypto.getRandomValues(buf)

controller.enqueue(buf)

controller.close()

},

})

const status = range ? 206 : 200

const headers: Record<string, string> = {

'Content-Type': 'application/octet-stream',

'Accept-Ranges': 'bytes',

'Content-Length': String(chunkSize),

}

if (range) {

headers['Content-Range'] = `bytes ${start}-${end}/${SIZE}`

}

return new Response(stream, { status, headers })

}

客户端续传async function fetchChunk(url: string, start: number) {

const res = await fetch(url, { headers: { Range: `bytes=${start}-` } })

const ab = await res.arrayBuffer()

return new Uint8Array(ab)

}

治理要点实际场景使用存储读取(Blob/文件系统/对象存储),并做边界与合法性校验。设置 `Accept-Ranges: bytes` 并正确返回 `Content-Range` 与 `206` 状态码。与鉴权协同,避免未授权下载;记录断点与进度以便恢复。验证与指标浏览器与客户端:断点续传可靠;大文件传输更稳定Next.js:15.0+;Edge Runtime:稳定

点赞(0) 打赏

评论列表 共有 0 条评论

暂无评论
立即
投稿

微信公众账号

微信扫一扫加关注

发表
评论
返回
顶部