我们有一个使用 PDF 的应用程序,但由于客户使用的 PDF 的大小,我们遇到了缓存问题。决定随时检查流式传输/使用范围请求以下载 PDF。
这是我所看到的:
accept-ranges: bytes
access-control-allow-credentials: true
access-control-allow-headers: Authorization, Content-Type, body, Content-Length, Accept-Ranges, Range
access-control-allow-methods: GET,POST,PUT,DELETE
access-control-allow-origin: http://example.test
access-control-max-age: 1000
cache-control: max-age=31536000
content-length: 185124353
content-type: application/pdf
date: Thu, 05 Dec 2019 14:03:42 GMT
etag: "some-etag-that-works-nicely"
有很多 CORS,因为我现在在本地运行它,甚至在我考虑将它推到开发环境之前。我认为我们已经添加了所有必需的标头以使 PDF.js 检测到我们支持范围调用,但它似乎无法正常工作。
当我深入到( )PDFJS-dist/build/pdf.js
行上的文件时,我看到了这个:23744
v2.3.200
if (getResponseHeader('Accept-Ranges') !== 'bytes') {
return returnValues;
}
这让我想到;也许这个getResponseHeader()
东西是区分大小写的,出于某种原因,我无法让 API 以我们习惯的整洁的混合大小写来响应其标题。所以我决定稍微修改一下,让它的 returnValues return allowRangeRequests = true
。
这很有效,因为然后我看到 a200 OK
具有与上面相同的标头(在OPTIONS
本地工作之后),应该取消但不是,然后是一堆206 PARTIAL
带有增量range: byte=0-65000
等标头的新调用,如下所示:
REQUEST
range: bytes=0-65535
//...and other headers of course, omitted for brevity.
RESPONSE
accept-ranges: bytes
access-control-allow-credentials: true
access-control-allow-headers: Authorization, Content-Type, body, Content-Length, Accept-Ranges, Range
access-control-allow-methods: GET,POST,PUT,DELETE
access-control-max-age: 1000
cache-control: max-age=31536000
content-length: 65536
content-type: application/pdf
依此类推,这也为我提供了视图中的实际工作 PDF(或至少几页);所以这表明它至少部分有效。
现在为什么我需要“破解”这个,我缺少什么标题让 PDF.js 检测到我们实际上支持范围,因为它似乎被正确实现了?这也是为什么它不会range: bytes=0-65535
因为“范围支持检测”的另一部分而取消初始提取的原因吗?