覆盖Sitecore中的强制下载行为

时间:2014-07-30 00:45:26

标签: pdf sitecore

即使点击了链接,我们的某些IE客户端也无法下载PDF。我们发现答案here解决了我们的问题:在web.config中为PDF mime类型设置 forcedownload = true

但是,这又产生了另一个问题:我们现在无法在浏览器中呈现PDF。我们曾经使用iframe执行此操作。但是,正如您所看到的,PDF只是下载,而不是在浏览器中呈现。

我了解到 forcedownload = true 设置实际上是Sitecore(v7.2)后续版本的默认设置。所以,我对犹豫是否犹豫不决。

那么,在这种情况下如何在浏览器中呈现PDF?

3 个答案:

答案 0 :(得分:3)

您可以将forceDownload=false保留在PDF mime类型上,而是将以下设置设为false:

<setting name="Media.EnableRangeRetrievalRequest" value="false"/>
几个月前,我在同样的初步修复中遇到了同样的困境。上周发现了实际问题,我写了一篇关于它的blog post。 (事实上​​,我写了你链接的答案,我现在已经用相同的信息为未来的访问者更新了它)

该问题基本上是IE9的Adobe Reader插件,分块传输编码和直接从数据库传输文件的组合。我发现如果您关闭浏览器并再试一次,或者使用Ctrl + F5强制刷新它工作正常。一旦Sitecore将文件缓存到磁盘,它将继续适用于所有人。

上述设置禁用了分块传输编码,而是将文件作为单个文件发送到浏览器。此设置是在Sitecore 6.5 +

中引入的

答案 1 :(得分:1)

这是MediaRequestHandler中的缺陷之一,在我看来; forceDownload选项在默认情况下是非常无用的。 (为什么只想在媒体扩展上配置此选项?)

您必须再次关闭forcedownload选项并将MediaRequestHandler替换为您自己的。无论如何,我通常最终会写自己的,因为如果其他问题与默认处理程序有关,例如正确处理CDN等。

在ProcessRequest管道中,您可以通过设置Content-Disposition标头来确定是否应该“下载”该项目。你基本上需要摆脱forceDownload的默认处理,并根据你自己的逻辑设置你的标题。

我个人更喜欢设置查询字符串参数,例如?dl = 1,并在此基础上设置Content-Disposition标头。您还可以扩展MediaItem模板以包含每个项目或子树上的默认行为(利用Sitecore继承和标准值),并且可能因此也可以定义(覆盖)每个项目上的附件部分的特定文件名。 Content-Disposition标头。

在渲染链接时,您可以利用属性集合(编写合适的扩展方法或类似方法),以便您可以清楚地标记链接意图下载的代码,但仍然可以利用内置字段渲染方法。因此,您可以消除弄乱页面编辑器等的风险。

/ Mikael

答案 2 :(得分:-1)

您必须通过将其值设置为false来禁用web.config中的范围检索请求。

<setting name="Media.EnableRangeRetrievalRequest" value="false" />  

MediaRequestHandler使Sitecore能够使用HTTP 206状态代码部分地在范围内下载PDF内容。您还可以覆盖MediaRequestHandler并编写自己的自定义实现来处理媒体请求。