在 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?

在 Android 上从 pdf 生成缩略图

Chrome 在下载 PDF 时发送两个请求(并取消其中一个)

Mpdf 不从内联 chrome 浏览器下载 pdf(但显示 pdf)

如何在 Mac 上从 Chrome 导出证书?

为啥chrome每次下载pdf文件时候提示可能损害计算机