Internet Explorer(默认设置,我通常假定它将在Great Unwashed的桌面上生效)似乎不喜欢在HTTP响应中接受附件内容的想法,如果相应请求不是直接从用户创建的操作(如“点击”处理程序或本地表单提交)。可能有更多的细节和细节,但这是令我感到沮丧的基本行为。什么是解决IE文件下载安全规则的技术?
在我看来,这种情况很普遍:某些可下载内容前的用户界面说,准备好的PDF报告—允许在创建内容时使用某些选项和输入。现在,与允许用户规定应用程序如何执行某些操作的所有形式一样,输入可能是错误的。并不总是,但有时候。
因此存在两难困境。如果客户端尝试做一些奇特的事情,比如运行AJAX事务让服务器审查表单内容,然后重新提交以获取下载,那么IE就不会那样。它不会喜欢它,因为携带附件的实际HTTP事务不会发生在原始用户操作事件处理程序中,而是发生在AJAX完成回调中。更糟糕的是,由于IE安全栏似乎认为解决所有问题的办法是简单地从其原始URL重新加载外部页面,因此它向用户发出的邀请继续下载可疑内容甚至不起作用。
另一种选择是只让表格开火。服务器检查参数,如果有任何错误,它会用表单容器页面作出响应,并用错误消息进行适当的插入。如果表单内容正常,它会生成内容并将其作为附件发回HTTP响应。在这种情况下(我认为),IE很高兴,因为内容显然是用户直接请求的(顺便说一句,这是一种可笑的方式来告诉坏内容中的好内容)。这很好,但现在的问题是客户端环境(也就是我的页面上的代码)无法确定下载是否正常工作,因此表单仍然只是坐在那里。如果我的表单处于某种对话框中,那么当真正完成操作时,我真的需要关闭该表单,这是实现AJAX方式的动机之一。
在我看来,唯一需要做的就是在窗体对话框中添加一些类似于“下载开始时关闭它”的消息。这对我来说真的很蹩脚,因为它是“请为我按下这个按钮”界面的一个例子:理想情况下,我自己的代码应该能够在合适的时候推动这个按钮。我不知道的一个关键是,是否有任何方式让客户端代码检测到表单提交导致附件下载。我从来没有听说过检测这种方法,但这会打破我的僵局。
不,当您提交表单并且响应是附件(即要下载的文件)时,浏览器不会重新绘制页面。 – Pointy 2010-01-14 15:04:13
最后一个看起来真是个好主意!如果下载失败,我不知道cookie是否会成功设置。明智的想法,无论它的工作与否! – Graza 2010-01-14 15:05:48
@Pointy:啊,好吧,它确实有点奇怪。我认为这些基本的想法可以适应你正在做的事情,但不会深陷其中...... @格拉扎:那很好。如果它不起作用,我不认为我称它为“精彩”,但是谢谢。 :-) – 2010-01-14 15:10:03