Как запустить загрузку файла при нажатии кнопки HTML или JavaScript

Это безумие, но я не знаю как это сделать, а потому что общие слова, трудно найти то, что мне нужно в поисковых системах. Думаю, на этот вопрос будет легко ответить.

Я хочу простую загрузку файла, которая будет делать то же самое, что и это:

<a href="file.doc">Download!</a>

но я хочу использовать кнопку HTML, например, любой из них:

<input type="button" value="Download!">
<button>Download!</button>

аналогично, можно ли запустить простую загрузку через JavaScript?

$("#fileRequest").click(function(){ /* code to download? */ });

Я определенно не ищет способ создать якорь, который выглядит как кнопка, использовать любые сценарии back-end или возиться с заголовками серверов или типами mime.

19 ответов


для кнопки вы можете сделать

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

Я провел некоторые исследования и нашел лучший ответ. Вы можете запустить загрузку с помощью нового HTML5


С помощью jQuery:

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

HTML-код:

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

вы можете сделать это с помощью "трюка" с невидимым iframe. Когда вы устанавливаете "src" на него, браузер реагирует так, как если бы вы нажали ссылку с тем же "href". В отличие от решения с формой, он позволяет встроить дополнительную логику, например, активируя загрузку после тайм-аута, когда выполняются некоторые условия и т. д.

Это также очень тихо, нет мигающего нового окна / вкладки, как при использовании window.open.

HTML:

<iframe id="invisible" style="display:none;"></iframe>

Javascript:

function download() {
    var iframe = document.getElementById('invisible');
    iframe.src = "file.doc";
}

старый поток, но ему не хватает простого решения js:

let a = document.createElement('a')
a.href = item.url
a.download = item.url.split('/').pop()
a.click()

о:

<input type="button" value="Download Now!" onclick="window.location = 'file.doc';">

Bootstrap Версии

<a class="btn btn-danger" role="button" href="path_to_file" download="proposed_file_name">Download</a>

документирована в Bootstrap 4 docs, а также работает в Bootstrap 3.


Я думаю, что это решение, которое вы искали

<button type="submit" onclick="window.location.href='file.doc'">Download!</button>

у меня был случай, когда мой 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);
}

вы можете скрыть ссылку для загрузки и нажать на кнопку.

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

где между <body> и </body> теги, положить в кнопку, используя код ниже:

<button>
    <a href="file.doc" download>Click to Download!</a>
</button>

Это обязательно получится!


это то, что, наконец, сработало для меня, так как файл для загрузки был определен при загрузке страницы.

JS для обновления атрибута action формы:

function setFormAction() {
    document.getElementById("myDownloadButtonForm").action = //some code to get the filename;
}

вызов JS для обновления атрибута action формы:

<body onLoad="setFormAction();">

тег формы с кнопкой отправки:

<form method="get" id="myDownloadButtonForm" action="">
    Click to open document:  
    <button type="submit">Open Document</button>
</form>

следующий сделал не работы:

<form method="get" id="myDownloadButtonForm" action="javascript:someFunctionToReturnFileName();">

 <a href="complexDownload" download="file.doc" onclick="this.href='file.doc';">
     <button>Download <i>File.doc</i> Now!</button>
 </a>

он, похоже, не работает в Safari, но он работал в Chrome. Кроме того, изменение атрибута href ссылки после нажатия пользователем казалось, что он работает в более старых версиях IE, но не в последних версиях IE или Edge.


Если вы ищете решение vanilla JavaScript (без jQuery) и без использования атрибута HTML5, вы можете попробовать это.

const download = document.getElementById("fileRequest");

download.addEventListener('click', request);

function request() {
    window.location = 'document.docx';
}
.dwnld-cta {
    border-radius: 15px 15px;
    width: 100px;
    line-height: 22px
}
<h1>Download File</h1>
<button id="fileRequest" class="dwnld-cta">Download</button>

другой способ сделать, если у вас есть сложный URL, такой как file.doc?foo=bar&jon=doe добавить скрытое поле в форме

<form method="get" action="file.doc">
  <input ty='hidden' name='foo' value='bar'/>
  <input ty='hidden' name='john' value='doe'/>
  <button type="submit">Download Now</button>
</form>

вдохновленный на @Cfreak ответ, который не является полным


Если вы не можете использовать форму, другой подход с downloadjs fit хороший. Downloadjs использует blob и html 5 файл API под капотом:

{downloadjs (url, filename)})/>

*это синтаксис jsx/react, но может использоваться в чистом html


для меня кнопка ading вместо текста привязки работает очень хорошо.

<a href="file.doc"><button>Download!</button></a>

это может быть не нормально по большинству правил, но это выглядит довольно хорошо.


Если вы используете <a> тег, не забудьте использовать весь url, который приводит к файлу -- т. е.:

<a href="http://www.example.com/folder1/file.doc">Download</a>

используйте обычную ссылку и стиль, чтобы выглядеть как кнопка, используя CSS.