在 Chrome 上从 S3 下载 PDF 的问题
Posted
技术标签:
【中文标题】在 Chrome 上从 S3 下载 PDF 的问题【英文标题】:Issue with downloading PDF from S3 on Chrome 【发布时间】:2012-02-24 07:12:33 【问题描述】:我在使用 Chrome 从 Amazon S3 下载 PDF 文件时遇到问题。
当我点击一个链接时,我的控制器将请求重定向到 S3 上文件的 URL。
它在 Firefox 上完美运行,但在 Chrome 上没有任何反应。
但是,如果我执行右键单击 -> 将位置另存为 将下载文件...
甚至将 S3 URL 复制粘贴到 Chrome 中也会导致空白屏幕...
以下是 curl 返回的一些信息:
Date: Wed, 01 Feb 2012 15:34:09 GMT
Last-Modified: Wed, 01 Feb 2012 04:45:24 GMT
Accept-Ranges: bytes
Content-Type: application/x-pdf
Content-Length: 50024
Server: AmazonS3
我的猜测与内容类型的问题有关......但我尝试的所有方法都不起作用。
【问题讨论】:
【参考方案1】:PDF 文档的规范Internet media type 实际上是The application/pdf Media Type (RFC 3778) 中定义的application/pdf
- 请注意application/x-pdf
,虽然在Portable Document Format 中经常遇到并列为媒体类型,但明显不存在来自Internet Assigned Numbers Authority (IANA)列出的官方Application Media Types。
我不知道application/x-pdf
出现的原因和时间,但显然Chrome PDF Plugin does not open application/x-pdf documents 到今天为止。
因此,您应该能够通过相应地更改存储对象的媒体类型来触发 Chrome 中的不同行为。
替代方案(用于经过身份验证的请求)
另一种方法是 Force a PDF to download 而不是让 Chrome 尝试打开它,这可以通过使用您的 GET
请求触发 Content-Diposition: attachment
标头来完成 - 请参阅GET Object 上的 S3 文档如何通过response-content-disposition
请求参数,特别是response-content-disposition=attachment
来实现这一点,如使用参数更改响应标头值的示例请求部分所述。
这仅适用于经过身份验证的请求,请参阅请求参数部分:
注意
您必须使用 Authorization 标头对请求进行签名 或预签名 URL,当使用这些参数时。它们不能使用 带有未签名(匿名)的请求。
【讨论】:
当我这样做时,我得到“请求特定的响应标头不能用于匿名 GET 请求。” -- 如何发出经过身份验证的请求? @Kerry:您可能是指替代方法,对吧?不幸的是,这确实只适用于经过身份验证的请求;我现在已经用 S3 文档中对 GET Object 的相应引用更新了我的答案,很抱歉在这里误导。【参考方案2】:有一个基于 html 的解决方案。由于 chrome 是最新的 HTML5,我们可以使用闪亮的新 download
属性!
<a href="http://www.domain.com/painful.pdf">Broken</a>
<a href="http://www.domain.com/painful.pdf" download="notsopainful">Works</a>
【讨论】:
以上是关于在 Chrome 上从 S3 下载 PDF 的问题的主要内容,如果未能解决你的问题,请参考以下文章
如何在 wsl2 上从 python3 运行 Selenium ChromeDriver?
Chrome 在下载 PDF 时发送两个请求(并取消其中一个)