如何下载文件,而不使用<a>元素与下载属性或服务器?

根据caniuse , Microsoft Edge build 10547+支持<a>元素的download属性,但不支持IE或Safari 。

如何下载文件对象,而不使用带有download属性集的<a>元素或服务器?

有几种触发下载的方法。 这里有几个:

使用表格:

 <form method="get" action="mydoc.doc"> <button type="submit">Download</button> </form> 

使用javascript:

 <button type="submit" onclick="window.open('mydoc.doc')">Download</button> 

你可以使用download属性和jquery来做到这一点。 下载属性不支持ie和safari / ios。 所以你可以使用jQuery来做到这一点

  $('.download').click(function(e) { e.preventDefault(); //stop the browser from following window.location.href = 'uploads/file.doc'; }); <a href="no-script.html" class="download">Download</a> 

使用FileSaver.js

它支持所有常用的浏览器。

只包括:

 <script type="text/javascript" src="FileSaver.min.js"></script> 

并使用它像:

 var file = new File(["Hello, world!"], "hello world.txt", {type: "text/plain;charset=utf-8"}); saveAs(file); 

注意:为了在Safari <6,Opera <15和FireFox <20中也能正常工作,需要将Blob.js作为依赖项。

虽然我支持@LeoFarmer的回答,但我想提供两个“可以破解”的方法:

  1. 如果文件非常小,可以使用href='data:[<mediatype>][;base64],<data>'

    这可以允许您添加mediatype内容处置,模拟HTTP标头。 这个黑客也不像人们希望的那样便携。

  2. 在中小文件中,可以使用AJAX下载文件,然后使用Javascript File API来提示保存文件 (API不支持保存,但将数据转换为数据url很简单)。

    如果你想避免Javascript File API,你可以尝试模拟一个锚点击,如这里所build议的 。

同样,正如Leo Farmer所指出的,这些解决scheme不能保证浏览器不会在新标签中打开文件而不是将其保存到磁盘上,但我认为可以肯定地说所有的用户都能够优雅地降级到cmd+Sctrl+S键盘快捷方式:-)

如果您使用的是服务器端,请按照表单提交机制来呈现页面。 在MVC中,我们可以使用下面的代码

HTML

  @using (Html.BeginForm("GetAttachment", "User", FormMethod.Post)) { <button type="submit">Download</button> } 

MVC控制器

 public ActionResult GetAttachment() { string filename = "File.pdf"; string filepath = AppDomain.CurrentDomain.BaseDirectory + "/Path/To/File/" + filename; byte[] filedata = System.IO.File.ReadAllBytes(filepath); string contentType = MimeMapping.GetMimeMapping(filepath); var cd = new System.Net.Mime.ContentDisposition { FileName = filename, Inline = true, }; Response.AppendHeader("Content-Disposition", cd.ToString()); return File(filedata, contentType); } 

您可以使用data URI data:[<mediatype>][;base64],<data>手动创build的文件的data:[<mediatype>][;base64],<data>表示,或者使用FileReader() .readAsDataURL()MIMEtypes设置为application/octet-streamencodeURIComponent()window.open()

 <script> var file = "data:application/octet-stream," + encodeURIComponent("<!DOCTYPE html>" + "<html><body>" + "<div>abc</div>" + "</body></html>"); var saveFile = window.open(file, "_self"); </script> 
 <script> var blob = new Blob(["abc"], {type:"text/plain"}); var reader = new FileReader(); reader.addEventListener("load", function(e) { // replace existing `MIME` type with `application/octet-stream` var file = "data:application/octet-stream;" + e.target.result.split(/;/)[1]; var saveFile = window.open(file, "_self"); }); reader.readAsDataURL(blob) </script> 

plnkr http://plnkr.co/edit/IS1OC0laRwL3BuuF9zay?p=preview