Pdf 重写Sitecore中的强制下载行为

Pdf 重写Sitecore中的强制下载行为,pdf,sitecore,Pdf,Sitecore,我们有一个问题,我们的一些IE客户端未能下载PDF,甚至在点击链接后。我们发现答案解决了我们的问题:在web.config中为PDF mime类型设置forcedownload=true 然而,这又产生了另一个问题:我们现在无法在需要时在浏览器中呈现PDF。我们以前用iframe来做这件事。但是,正如您所看到的,PDF只是下载,不在浏览器中呈现 我了解到forcedownload=true设置实际上是Sitecore后续版本(v7.2)中的默认设置。所以,我很犹豫是否要恢复这一点 那么,在这种情

我们有一个问题,我们的一些IE客户端未能下载PDF,甚至在点击链接后。我们发现答案解决了我们的问题:在web.config中为PDF mime类型设置forcedownload=true

然而,这又产生了另一个问题:我们现在无法在需要时在浏览器中呈现PDF。我们以前用iframe来做这件事。但是,正如您所看到的,PDF只是下载,不在浏览器中呈现

我了解到forcedownload=true设置实际上是Sitecore后续版本(v7.2)中的默认设置。所以,我很犹豫是否要恢复这一点


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

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

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

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

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

呈现链接时,您可以利用properties集合(编写适当的扩展方法或类似方法),这样您就可以清楚地标记要下载链接的代码,但仍然可以利用内置的field render方法。从而消除了弄乱页面编辑器等的风险


/Mikael

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

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

几个月前,我面临着同样的困境,也面临着同样的初始修复。上周我发现了真正的问题,写了一篇关于它的文章。(事实上,我写了你链接到的答案,我现在已经用相同的信息更新了它,以供将来的访问者使用)

这个问题基本上是针对IE9的Adobe Reader插件、分块传输编码和直接从数据库流式传输文件的组合。我发现如果你关闭浏览器再试一次,或者用Ctrl+F5强制刷新,效果很好。一旦Sitecore将文件缓存到磁盘,它将继续为每个人工作


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

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

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


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

我删除了示例链接,因为它不再显示该行为。有关详细信息,请参阅编辑评论。这里的想法不错,但我还是接受@jammykam的建议,因为这只是一个设置,并且警告是可以接受的。