如何下载文件,而不使用<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的回答,但我想提供两个“可以破解”的方法:
-
如果文件非常小,可以使用
href='data:[<mediatype>][;base64],<data>'
。这可以允许您添加
mediatype
内容处置,模拟HTTP标头。 这个黑客也不像人们希望的那样便携。 -
在中小文件中,可以使用AJAX下载文件,然后使用Javascript File API来提示保存文件 (API不支持保存,但将数据转换为数据url很简单)。
如果你想避免Javascript File API,你可以尝试模拟一个锚点击,如这里所build议的 。
同样,正如Leo Farmer所指出的,这些解决scheme不能保证浏览器不会在新标签中打开文件而不是将其保存到磁盘上,但我认为可以肯定地说所有的用户都能够优雅地降级到cmd+S
或ctrl+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()
, MIME
types设置为application/octet-stream
, encodeURIComponent()
, 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>