单击HTML按钮或JavaScript时如何触发文件下载

bre*_*ine 389 html javascript download

这很疯狂,但我不知道如何做到这一点,而且由于这些词有多常见,很难在搜索引擎上找到我需要的东西.我认为这应该是一个容易回答的问题.

我想要一个简单的文件下载,它会像这样做:

<a href="file.doc">Download!</a>
Run Code Online (Sandbox Code Playgroud)

但我想使用HTML按钮,例如以下任何一种:

<input type="button" value="Download!">
<button>Download!</button>
Run Code Online (Sandbox Code Playgroud)

同样,是否可以通过JavaScript触发简单下载?

$("#fileRequest").click(function(){ /* code to download? */ });
Run Code Online (Sandbox Code Playgroud)

我绝对不是在寻找一种方法来创建一个看起来像按钮的锚,使用任何后端脚本,或者混淆服务器头或mime类型.

Joe*_*ott 403

我做了一些研究,找到了最好的答案.您可以使用新的HTML5 download属性触发下载.

<a href="path_to_file" download="proposed_file_name">Download</a>
Run Code Online (Sandbox Code Playgroud)

地点:

  • path_to_file 是绝对路径还是相对路径,
  • blob: 要保存的文件名(可以为空,则默认为实际文件名).

希望这是有帮助的.

Whatwg 文档

我可以用吗

  • 不适用于Safari和某些IE版本 (37认同)
  • 问题明确要求使用按钮而不是链接 (9认同)
  • 如何将其应用于*button*对象而不仅仅是*a标签*? (8认同)
  • 实际上,这仅适用于MDN文档中提到的相同来源的URL.如果我们正在寻求开发通用解决方案,这是一个巨大的限制 (7认同)
  • 使用`download`和`target ="_ blank"`的组合似乎足以涵盖大多数用例.理解`download`的浏览器将其视为下载,否则将在新选项卡中打开. (3认同)
  • @storm_m2138 你只需将按钮包裹在 a.. &lt;a href="path_to_file" download="proposed_file_name"&gt;&lt;button type=button"&gt;我的按钮&lt;/button&gt;&lt;/a&gt; (2认同)

Cfr*_*eak 268

对于你可以做的按钮

<form method="get" action="file.doc">
   <button type="submit">Download!</button>
</form>
Run Code Online (Sandbox Code Playgroud)

  • @kscius甚至今天IE 11中不支持下载属性(Edge现在支持它),Safari不支持它.在2012年答案最初发布时,任何主要浏览器都不支持. (8认同)
  • 这*不一定*会触发下载。它只会导致浏览器导航到“file.doc”。这是否会导致“file.doc”被下载或在浏览器中显示为页面,取决于服务器在提供“file.doc”服务时返回的标头以及浏览器能够呈现的文件类型。 (8认同)
  • 不起作为触发器,只是重定向到作为'a'标记的网址. (7认同)
  • 这样做效果更好:<a href="path_to_file" download="proposed_file_name">下载</a> (6认同)
  • 具有按钮样式的锚点和具有按钮的表单之间有什么区别? (2认同)

小智 72

HTML:

<button type="submit" onclick="window.open('file.doc')">Download!</button>
Run Code Online (Sandbox Code Playgroud)

  • 最好,最干净的解决方案.但是你不需要任何额外的Javascript.使用onclick的HTML部分就足够了. (8认同)
  • 如果您有一个浏览器可以接受的文件,如PDF,它将在新标签中打开,而不是显示下载对话框. (5认同)
  • 如果我想下载一个xml文件怎么办? (4认同)
  • window.open 可以在浏览器中触发弹出窗口阻止,因此不推荐。您可以使用 window.location = 'path' ,尽管这会转到同一浏览器窗口中的位置。 (3认同)
  • 感谢您的代码。我已经测试过,它可以在IE,Chrome,Firefox中运行。 (2认同)
  • 这不一定会触发下载。它只会导致浏览器导航到“file.doc”。这是否会导致 file.doc 被下载或在浏览器中显示为页面,取决于服务器在提供“file.doc”服务时返回的标头以及浏览器能够呈现的文件类型。 (2认同)

Mat*_*all 65

使用jQuery:

$("#fileRequest").click(function() {
    // // hope the server sets Content-Disposition: attachment!
    window.location = 'file.doc';
});
Run Code Online (Sandbox Code Playgroud)

  • 没有"最多".这完全取决于.不要依赖它被设置. (5认同)
  • 这个问题一直让我变得暴躁,这是唯一有效的选择(并得到了IE的支持).我会添加像我这样的任何n00bs来设置Content-Disposition,你所要做的就是:<?php header('Content-Disposition:attachment; filename ="filename.here"'); ?> (3认同)
  • 没有jquery。期。 (3认同)
  • 很好,谢谢。您是否知道大多数服务器是否会默认将 Content-Disposition 设置为“附件”? (2认同)
  • 如果您尝试下载图像,这不起作用,它会在浏览器中打开图像 (2认同)

Ste*_*hrs 25

旧线程,但它缺少一个简单的js解决方案:

let a = document.createElement('a')
a.href = item.url
a.download = item.url.split('/').pop()
document.body.appendChild(a)
a.click()
document.body.removeChild(a)
Run Code Online (Sandbox Code Playgroud)

  • @NicholasKyriakides有点让我想起这个宝石:https://image.ibb.co/dtkUWJ/Selection_002.png (12认同)
  • 这是这里最好的解决方案,应该被接受。 (4认同)
  • @BryanLarsen 你是对的,Firefox 不允许在不先将元素添加到 body 的情况下这样做。谢谢,更新答案 (2认同)
  • 有没有办法在下载完成后触发 javascript 功能?只是尝试在下载开始后显示一条消息,并在下载完成后删除该消息。 (2认同)
  • @mohitbansal(联合国)幸运的是没有,因为它在浏览器级别 (2认同)

Dan*_*lor 21

你可以使用隐形iframe的"技巧"来做到这一点.当您为其设置"src"时,浏览器会做出反应,就像您单击具有相同"href"的链接一样.与表单解决方案相反,它使您能够嵌入其他逻辑,例如在超时后激活下载,满足某些条件等.

它也很简单,没有像使用时那样闪烁的新窗口/标签window.open.

HTML:

<iframe id="invisible" style="display:none;"></iframe>
Run Code Online (Sandbox Code Playgroud)

使用Javascript:

function download() {
    var iframe = document.getElementById('invisible');
    iframe.src = "file.doc";
}
Run Code Online (Sandbox Code Playgroud)

  • 尽管它曾经可以工作,但现在似乎在 Chrome 中不起作用。我想知道它是否会在不同版本的 Chrome 中间歇性停止工作。 (2认同)

CFP*_*ort 13

引导版本

<a class="btn btn-danger" role="button" href="path_to_file"
   download="proposed_file_name">
  Download
</a>
Run Code Online (Sandbox Code Playgroud)

记录在引导4个文档,并在引导3工作为好.

  • 与Bootstrap唯一相关的是类名,它只是HTML5的强大功能。 (4认同)
  • 如果您对 bootstrap 有任何了解,您会发现它是一个按钮。 (3认同)
  • 问题是明确询问如何使用按钮而不是链接来执行此操作。 (2认同)

Del*_*nis 10

我认为这是您正在寻找的解决方案

<button type="submit" onclick="window.location.href='file.doc'">Download!</button>
Run Code Online (Sandbox Code Playgroud)

我讨厌我的Javascript生成CSV文件的情况.由于没有可下载的远程URL,我使用以下实现.

downloadCSV: function(data){
    var MIME_TYPE = "text/csv";

    var blob = new Blob([data], {type: MIME_TYPE});
    window.location.href = window.URL.createObjectURL(blob);
}
Run Code Online (Sandbox Code Playgroud)


oll*_*lli 9

关于什么:

<input type="button" value="Download Now!" onclick="window.location = 'file.doc';">
Run Code Online (Sandbox Code Playgroud)

  • 例如,如果您的文件是图像,则这不起作用,因为它只是在浏览器中打开. (5认同)

Sta*_*wii 6

您可以隐藏下载链接并使按钮单击它.

<button onclick="document.getElementById('link').click()">Download!</button>
<a id="link" href="file.doc" download hidden></a>
Run Code Online (Sandbox Code Playgroud)

  • 永远不要这样做 (4认同)

Sur*_*gch 6

在我的测试中,只要您使用相对链接,以下内容就适用于所有文件类型和浏览器:

<a href="/assets/hello.txt" download="my_file.txt"><button>Download 2</button></a>
Run Code Online (Sandbox Code Playgroud)
  • /assets/hello.txt只是我网站上的相对路径。将其更改为您自己的相对路径。
  • my_file.txt是您希望文件下载时调用的名称。

解释

我注意到很多答案下都有评论说浏览器只会尝试打开文件本身,而不是根据文件类型下载它。我发现这是真的。

我制作了两个按钮来使用两种不同的方法进行测试:

在此输入图像描述

<button onclick="window.location.href='/assets/hello.txt';">Download 1</button>

<a href="/assets/hello.txt" download="my_file.txt"><button>Download 2</button></a>
Run Code Online (Sandbox Code Playgroud)

注意事项

  • 按钮 1 在新的浏览器选项卡中打开文本文件。但是,按钮 1下载其自身无法打开的文件类型的文件(例如 .apk 文件)。
  • 按钮 2 下载了文本文件。但是,按钮 2 仅在相对路径时下载文件。当我将路径更改为绝对路径时,浏览器会在新选项卡中打开它。

我在 Firefox、Safari 和 Chrome 上对此进行了测试。