Как запустить загрузку файла при нажатии кнопки 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';
});
вы можете сделать это с помощью "трюка" с невидимым 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()
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>