繁体   English   中英

使用代码 206 部分内容时下载不起作用

[英]Download doesn't work when using code 206 Partial Content

我有一个强制在浏览器中下载文件的功能,它对小文件有效,但对大文件似乎不起作用。 下载开始时,我收到Failed - No File ,我将范围缩小到原因是我设置了206状态代码(部分内容)。 这曾经工作得很好,但现在我收到了No File消息。

将其更改为状态代码200 ,文件将被下载。 将状态代码保持为206并删除Content-Disposition ,文件将在浏览器中播放。

下载大文件时甚至需要206吗?

失败 - 没有文件

export class Server {
  private static async send(client: Client, req: http.IncomingMessage, res: http.ServerResponse) {
    let fileSize = client.response.contentLength
    let start = 0, end = fileSize - 1 < start ? start : fileSize - 1
    if (fileSize > (this.app.chunkSize || 5e5)) {
      let range = (req.headers.range || '') as string
      let positions = range.replace(/bytes=/, '').trim().split('-')
      start = parseInt(positions[0] || '0', 10)
      end = parseInt(positions[1] || (fileSize - 1).toString(), 10)
      let chunkSize = (end - start) + 1

      // Setting the Code to 206 here breaks
      client.response.setCode(206)
        .setHeaders({
          'Content-Range': `bytes ${start}-${end}/${fileSize}`,
          'Accept-Ranges': 'bytes',
          'Connection': 'Keep-Alive',
          'Content-Length': chunkSize
        })
    }

    res.writeHead(client.response.code, <any>headers)

    let { store, file } = client.response.fileStore

    let stream: fs.ReadStream = store.readStream(file, { start, end })
      .on('open', () => stream.pipe(res))
      .on('close', () => res.end())
      .on('error', err => res.end(err))
  }
}

这里的读取流非常简单:

export default class extends Storage {
  public readStream(filePath: string, options?: FileReadOptions) {
    return fs.createReadStream(this.toPath(filePath), options)
  }
}

标题

要求

仅在浏览器明确请求时发送206 ,否则发送200

if (!!req.headers.range) {
  // if and only if client sends us range http reader in request,
  // perform your logic, send 206
} else {
  // forget about partial content here,
  // pipe the file to res directly with 200
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM