Javascript 启动一个即使在IE中也能正常工作的文件下载?

Javascript 启动一个即使在IE中也能正常工作的文件下载?,javascript,internet-explorer,download,Javascript,Internet Explorer,Download,我想了解更多关于从Javascript启动文件下载的最佳方式的想法 有很多好的想法,可以总结如下: 在iframe上设置src 使用window.location.replace() 使用具有元刷新标题的页面 使用window.open() 让服务器直接输出文件,设置内容类型和内容配置 除了IE8之外,所有这些方法都适用于我测试过的浏览器。使用IE8,我会遇到一大堆问题: iframe无法工作,因为我使用的环境设置了cookie。我想我需要启用P3P头来解决这个问题,但环境不允许我设置头,因此P

我想了解更多关于从Javascript启动文件下载的最佳方式的想法

有很多好的想法,可以总结如下:

  • 在iframe上设置src
  • 使用window.location.replace()
  • 使用具有元刷新标题的页面
  • 使用window.open()
  • 让服务器直接输出文件,设置内容类型和内容配置
除了IE8之外,所有这些方法都适用于我测试过的浏览器。使用IE8,我会遇到一大堆问题:

  • iframe无法工作,因为我使用的环境设置了cookie。我想我需要启用P3P头来解决这个问题,但环境不允许我设置头,因此P3P已退出
  • window.location.replace()可以工作,但在IE8中,窗口的地址栏更改为文件的URL,并且在打开下载的文件后,基础窗口为空
  • meta refresh方法也可以工作,但在文件下载后,地址栏仍会更改为文件的URL,底层窗口为空
  • 我拼命想避开window.open()以避开任何弹出窗口阻止程序问题
  • 我所在的服务器环境不允许您输出文件本身,就像您在ASP.NET的响应对象中所做的那样
我甚至没有在IE6或IE7上尝试过这些方法,所以可能还有其他的惊喜

那么,有没有人对在IE中启动下载有任何其他建议,(1)不涉及弹出窗口,(2)可以保存或打开文件,(3)不留下空白窗口,(3)只使用Javascript、HTML和文件URL


丹佛麦克下载文件页面的通常模式(如果你必须有一个,我个人讨厌它)是:

<script type="text/javascript">
    window.onload= function() {
        window.location= document.getElementById('downloadlink').href;
    }
</script>
<p>
    Your download will begin shortly. If it doesn't,
    <a id="downloadlink" href="file.zip">click here</a>.
</p>

window.onload=function(){
window.location=document.getElementById('downloadlink').href;
}

您的下载将很快开始。如果没有,
.

或者使用元刷新而不是脚本。任何一种方式都应该表现得差不多

元刷新方法也可以工作,但地址栏仍然会更改为文件的URL,并且在文件下载后,底层窗口是空白的

这不应该发生。是否有可以测试的在线版本?通常,当浏览器通过任何常规方法(link click、location.href、meta refresh)直接下载文件时,它应该保持上一页在屏幕上

环境不允许我设置标题,因此P3P不可用

您不必使用标题来设置P3P策略,HTML标记也可以:

<link rel="P3Pv1" href="/policy.p3p" />

但你为什么要这么做?如果目标URL只是为一个文件服务,那么根本不需要设置cookie,那么为什么还要麻烦P3P呢

我拼命地试图避开window.open()以避免弹出窗口阻止程序出现问题

如果您在响应用户单击时使用window.open(),则不会出现弹出窗口阻止程序问题

并不是说你需要打开一个弹出窗口来下载一个文件。我开始觉得你链接到的文件下载目的地有些奇怪 — 好像它根本不是一个文件下载,而是某种奇怪的HTML web应用程序。链接到下载并不难,你只要链接到文件,工作就完成了;你似乎让事情变得比本质上更难


仅链接到文件的唯一常见问题是,如果文件包含文本、HTML、XML或图像,浏览器将以内联方式显示它,而不是下载它。解决此问题的唯一方法是使用“Content Disposition:attachment”头,方法是通过设置此头的脚本提供此头,或者将web服务器配置为发送所有文件下载的头。如果您无法在服务器环境中执行这两项操作,则没有解决方案。

您能详细介绍一下服务器环境吗?嗨,Joel,这是为在Salesforce.com服务器上运行而构建的--它们有自己的编程语言,称为Apex。非常感谢您的详细评论和优秀提示。我决定只提供一个链接来下载该文件,它在所有浏览器中都能很好地工作,避免了所有这些复杂问题。