从以下代码中我创建了一个下载文件的动态锚标记。此代码适用于Chrome,但不适用于IE。我怎样才能使这个工作
<div id="divContainer">
<h3>Sample title</h3>
</div>
<button onclick="clicker()">Click me</button>
<script type="text/javascript">
function clicker() {
var anchorTag = document.createElement('a');
anchorTag.href = "http://cdn1.dailymirror.lk/media/images/finance.jpg";
anchorTag.download = "download";
anchorTag.click();
var element = document.getElementById('divContainer');
element.appendChild(anchorTag);
}
</script>
答案 0 :(得分:24)
Internet Explorer目前不支持Download
标记上的A
属性。
见http://caniuse.com/download和http://status.modern.ie/adownloadattribute;后者表明IE12的功能正在“考虑中”。
答案 1 :(得分:18)
就我而言,由于需要支持IE 11(版本11.0.9600.18665)的使用,我最终使用了@Henners提供的解决方案来评论:
// IE10+ : (has Blob, but not a[download] or URL)
if (navigator.msSaveBlob) {
return navigator.msSaveBlob(blob, fileName);
}
这很简单实用。
答案 2 :(得分:9)
老问题,但我想我会添加我们的解决方案。这是我在上一个项目中使用的代码。它并不完美,但它在所有浏览器和IE9 +中都通过了QA。
downloadCSV(data,fileName){
var blob = new Blob([data], {type: "text/plain;charset=utf-8;"});
var anchor = angular.element('<a/>');
if (window.navigator.msSaveBlob) { // IE
window.navigator.msSaveOrOpenBlob(blob, fileName)
} else if (navigator.userAgent.search("Firefox") !== -1) { // Firefox
anchor.css({display: 'none'});
angular.element(document.body).append(anchor);
anchor.attr({
href: 'data:attachment/csv;charset=utf-8,' + encodeURIComponent(data),
target: '_blank',
download: fileName
})[0].click();
anchor.remove();
} else { // Chrome
anchor.attr({
href: URL.createObjectURL(blob),
target: '_blank',
download: fileName
})[0].click();
}
}
使用ms特定的API在IE中最适合我们。另请注意,某些浏览器要求锚实际位于DOM中以使下载属性起作用,而Chrome则不需要。此外,我们发现Blob在各种浏览器中的工作方式存在一些不一致之处。某些浏览器也有出口限制。这允许每个浏览器中最大可能的CSV导出。
答案 3 :(得分:5)
从版本10547+开始,Microsoft Edge浏览器现在支持download
标记上的a
属性。
<a href="download/image.png" download="file_name.png">Download Image</a>
边缘功能更新:https://dev.windows.com/en-us/microsoft-edge/platform/changelog/desktop/10547/
[下载]标准:http://www.w3.org/html/wg/drafts/html/master/links.html#attr-hyperlink-download
答案 4 :(得分:2)
此代码片段允许在IE,Edge和其他现代浏览器中保存文件中的blob。
var request = new XMLHttpRequest();
request.onreadystatechange = function() {
if (request.readyState === 4 && request.status === 200) {
// Extract filename form response using regex
var filename = "";
var disposition = request.getResponseHeader('Content-Disposition');
if (disposition && disposition.indexOf('attachment') !== -1) {
var filenameRegex = /filename[^;=\n]*=((['"]).*?\2|[^;\n]*)/;
var matches = filenameRegex.exec(disposition);
if (matches != null && matches[1]) filename = matches[1].replace(/['"]/g, '');
}
if (window.navigator.msSaveOrOpenBlob) { // for IE and Edge
window.navigator.msSaveBlob(request.response, filename);
} else {
// for modern browsers
var a = document.createElement('a');
a.href = window.URL.createObjectURL(request.response);
a.download = filename;
a.style.display = 'none';
document.body.appendChild(a);
a.click();
}
}
button.disabled = false;
dragArea.removeAttribute('spinner-visible');
// spinner.style.display = "none";
};
request.open("POST", "download");
request.responseType = 'blob';
request.send(formData);
对于IE和Edge使用:msSaveBlob
答案 5 :(得分:1)
使用我的功能
它将您的标签绑定到IE中下载文件
function MS_bindDownload(el) {
if(el === undefined){
throw Error('I need element parameter.');
}
if(el.href === ''){
throw Error('The element has no href value.');
}
var filename = el.getAttribute('download');
if (filename === null || filename === ''){
var tmp = el.href.split('/');
filename = tmp[tmp.length-1];
}
el.addEventListener('click', function (evt) {
evt.preventDefault();
var xhr = new XMLHttpRequest();
xhr.onloadstart = function () {
xhr.responseType = 'blob';
};
xhr.onload = function () {
navigator.msSaveOrOpenBlob(xhr.response, filename);
};
xhr.open("GET", el.href, true);
xhr.send();
})
}
答案 6 :(得分:0)
先添加孩子,然后点击
或者您可以使用window.location ='url';
答案 7 :(得分:0)
如前面的回答所述,IE中不支持下载属性。作为解决方法,您可以使用iFrames下载文件。这是一个示例代码段。
function downloadFile(url){
var oIframe = window.document.createElement('iframe');
var $body = jQuery(document.body);
var $oIframe = jQuery(oIframe).attr({
src: url,
style: 'display:none'
});
$body.append($oIframe);
}
答案 8 :(得分:0)
我从here复制了代码,并为ES6和ESLint更新了代码,并将其添加到我的项目中。
您可以将code保存到download.js
并像这样在项目中使用它:
import Download from './download'
Download('/somefile.png', 'somefile.png')
请注意,它支持dataURLs(来自canvas对象),以及更多信息。有关详细信息,请参见https://github.com/rndme。