使用JavaScript实现浏览器下载文件提示

12

我想知道是否有一种方法可以使用JavaScript实现浏览器的下载文件提示。

我的理由是用户将上传文件到本地文件服务器,该服务器无法从Web服务器访问。换句话说,它们位于不同的域上!

例如,假设网站托管在www.xyz.com上,但文件将驻留在具有类似地址的本地文件服务器上:\\10.10.10.01\Files\file.txt。我如何将文件上传/传输到本地文件服务器......使用ActiveX和VBscript!(别问我为什么)

因此,我将本地文件路径存储在数据库中,并将该数据绑定到网格上。当用户单击该链接时,文件将在窗口中打开(使用JavaScript)。

问题是某些文件类型,如文本、jpg、pdf等,在浏览器窗口内打开。我怎样才能使用客户端脚本实现content-typecontent-disposition?这可行吗?

编辑: 本地文件服务器有一个窗口共享文件夹,文件保存在其中。


我非常确定用JavaScript无法完成这个任务。 - Konstantin Tarkus
请查看关于内容分发的这篇文章。正如所说,它必须在响应头中设置,而不是JavaScript实现。 - Alex Rozanski
你的“本地文件服务器”是什么类型的服务器?实际上是HTTP/FTP或其他类型的服务器,还是指Windows共享文件夹(例如,你是指\\10.10.10.01而不是//10.10.10.01)? - Christoph
这是Windows中的共享文件夹,实际文件路径为 '\10.10.10.01\Files\file.txt'。 - aunlead
尝试了这个 http://www.webdeveloper.com/forum/showpost.php?p=74189&postcount=3 但没有成功... - aunlead
@aix:那你就没办法了——没有办法通过HTTP头发送适当的元信息。 - Christoph
4个回答

6
"

content-disposition: attachment" 是唯一的强制下载的方式,必须在响应头中设置。

"

我该如何在客户端设置它?目前我正在使用JavaScript打开文件。调用window.open('\10.10.10.01\Files\file.txt')来打开文件。这将在一个窗口中打开文件。 “content-disposition: attachment”不是服务器端响应头设置吗? - aunlead
正如问题所述,“这必须在响应头中设置”,您无法在客户端上设置它。 - Quentin

5
如果文件托管在像您示例中的Web服务器上,您可以执行以下操作:
window.location.replace(fileUrl);

..并且浏览器将决定如何处理该文件。这对大多数文件非常有效,例如.xls、.csv等,但请记住,这并不是绝对可靠的,因为用户的MIME处理程序设置将确定如何处理该文件... 即如果它是一个.txt文件,则最可能只会在浏览器中显示而不会出现“文件下载”对话框。


请注意,这意味着您可以将以下内容放入地址栏:data:text/csv,a,b,c%0ad,e,f(这将创建一个具有3列和2行的CSV文件下载)。不确定这是否符合原始问题,但是在搜索如何创建该提示时,我最终来到了这里。也许它能帮助未来的读者 :) - Luc

4

截至2015年8月,在您的 <a> 标签中添加“download”属性可以实现您正在寻找的行为,至少在Chrome浏览器中可以。


3
很遗憾,Firefox不支持跨域操作,而且在Safari、Edge和IE上也无法使用,这使得下载属性对我没有用处。:/ - Sojtin

2
您可以尝试使用带有type="application/octet-stream"的普通超链接。在FF中似乎有效,但IE和Opera会忽略该属性。

按规范,IE和Opera是正确的。类型属性表示“期望从服务器获取此内容”,因此不理解特定内容类型的客户端可以避免尝试下载它(对于机器人最有用)。真正的Content-Type比它更重要。 - Quentin
在我看来,IE和Opera是错误的:在没有任何其他内容类型信息的情况下(这种情况就是这里),浏览器应该尊重类型属性给出的“咨询提示”(HTML规范);记住,文件不是通过HTTP发送的,因此没有Content-Type字段可以取代该属性。 - Christoph

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接