什么是技术来解决IE文件下载安全规则?

Internet Explorer(默认设置,我通常认为它将在Great Unwashed的桌面上生效)似乎不喜欢在HTTP响应中接受附件内容的想法,如果相应的请求不是直接从用户操作像“点击”处理程序,或本地表单提交)。 可能有更多的细节和细节,但这是令我感到沮丧的基本行为。

在我看来,这种情况很普遍:在某些可下载内容前面的用户界面 – 比如,一个准备好的PDF报告 – 允许在创build内容时使用一些选项和input。 现在,与允许用户规定应用程序如何执行某些操作的所有forms一样,input可能是错误的。 并不总是,但有时。

所以有一个两难的问题。 如果客户端试图做一些奇特的事情,比如运行一个AJAX事务让服务器审查表单内容,然后重新提交以获得下载,那么IE就不会这样。 它不会喜欢它,因为携带附件的实际HTTP事务不会发生在原始的用户操作事件处理程序中,而是发生在AJAX完成callback中。 更糟糕的是,由于IE安全栏似乎认为解决所有问题的办法是简单地从其原始URL中重新加载外部页面,其向用户发出的邀请继续下载可疑内容将不可行。

另一种select是只是让forms开火。 服务器检查参数,如果有任何错误,它会响应表单容器页面,并用错误信息适当地插入。 如果表单内容正常,它将生成内容并将其作为附件发送回HTTP响应。 在这种情况下(我认为),IE很高兴,因为内容显然是被用户直接请求的(顺便说一句,从坏内容中分辨好的内容是一种荒谬的方式)。 这很好,但现在的问题是,客户端环境(即我的页面上的代码)无法确定下载是否正常工作,所以表单仍然只是坐在那里。 如果我的表单正在进行某种对话,那么当操作完成时,我真的需要closures它 – 实际上,这是AJAX方式的动机之一。

在我看来,唯一要做的就是在表单对话框中添加一些类似于“下载开始时closures”的消息。 对我来说,这真的很蹩脚,因为这是一个“请为我按下这个button”界面的例子:理想情况下,我自己的代码应该能够在合适的时候推动这个button。 我不知道的一个关键是,是否有任何方式让客户端代码检测到表单提交导致附件下载。 我从来没有听说过检测这种方法,但这会打破我的僵局。

我认为你是用不同的目标窗口提交表单; 因此forms留在原地。

有几个选项。

  1. 保持提交button被禁用,并在后台进行持续validation,轮询表单以更改字段,然后在字段发生更改时触发validation请求。 当表单处于有效状态时,启用该button; 当它不是,禁用button。 这不是完美的,因为这往往会有延迟,但对于你所做的事情来说,这可能已经足够好了。
  2. 在表单submit事件的处理程序中,执行不需要往返服务器的基本validation,然后提交表单并将其删除(或者可能只是隐藏它)。 如果服务器上的进一步validation检测到问题,则可以返回使用JavaScript的页面来告诉原始窗口重新显示表单。
  3. 使用一个会话cookie和一个唯一的表单ID( new Date().getTime()会做的)当前时间; 当表单提交时,禁用它的提交button,但保持可见,直到响应回来。 使响应设置一个会话cookie与该ID指示成功/失败。 让窗口每隔一秒左右包含表单轮询cookie,并在结果看到它时对结果进行处理。 (我从来没有做过最后一个;不立即看到为什么它不会工作。)

我期望有十几种其他的方式去磨这只猫,但是那些是想到的三个。

(编辑)如果你没有提交不同的目标,你可能想要继续这样做 – 在同一页面上隐藏的iframe 。 这(可能与以上或其他答案相结合)可能会帮助您获得您正在寻找的用户体验。

IE做这个事情的确有很多原因 ,我相信这不是任何人会争论的 – 所以主要目标是绕过它来让用户更好。

有时候值得重新考虑事情是如何完成的。 也许禁用button,使用javascript来检查所有的字段填写,一旦他们是一个ajax请求。 如果Ajax成功,启用button。 这只是一个build议,我相信会有更多的…

编辑:更多…

做简单的提交(非AJAX),如果检查失败,发回一个页面而不是附件。 发回的页面可以包含最初提交的所有信息(加上任何错误信息给用户),所以用户不需要再填写整个表单。 我也相信会有更多的想法…

编辑:更多…

我确信你以前看过这种types的东西 – 是的,这一个额外的点击(不理想,但不难)….一个“如果你的下载失败,点击这里” – >在这种情况下,按照你想做的那样做,但是当AJAX返回的时候在页面上添加一个新的链接/button,所以如果下载失败,他们可以从“直接用户操作”提交已经validation的表单。 我相信我会想更多(或别人会)…..