Javascript 下载数据URL文件
我的想法是制作一个完全基于JavaScript的zip/unzip实用程序,任何人都可以从浏览器访问。他们只需将zip直接拖动到浏览器中,即可下载其中的所有文件。他们还可以通过拖动单个文件来创建新的zip文件 我知道最好在服务器端完成,但这个项目只是为了好玩 如果我充分利用各种可用的方法,将文件拖到浏览器中应该很容易。(Gmail风格) 编码/解码应该很好。我见过一些AS3ZIP库,所以我相信我应该可以接受 我的问题是最后下载文件Javascript 下载数据URL文件,javascript,data-uri,Javascript,Data Uri,我的想法是制作一个完全基于JavaScript的zip/unzip实用程序,任何人都可以从浏览器访问。他们只需将zip直接拖动到浏览器中,即可下载其中的所有文件。他们还可以通过拖动单个文件来创建新的zip文件 我知道最好在服务器端完成,但这个项目只是为了好玩 如果我充分利用各种可用的方法,将文件拖到浏览器中应该很容易。(Gmail风格) 编码/解码应该很好。我见过一些AS3ZIP库,所以我相信我应该可以接受 我的问题是最后下载文件 window.location = 'data:jpg/imag
window.location = 'data:jpg/image;base64,/9j/4AAQSkZJR....'
这在Firefox中运行良好,但在Chrome中不起作用
我可以使用
将文件作为图像嵌入到chrome中,但文件不一定是图像。它们可以是任何格式
有人能想出另一种解决方案或解决办法吗?想法:
- 尝试使用
而不是数据URL(同样适用于IE)
- 具有“保存到文件”支持。只需将
设置为数据URIdocument.location.href
- 。它使用
指定文件名
- 您的问题本质上归结为“并非所有浏览器都支持此功能”
您可以尝试一种变通方法,并从Flash对象提供解压缩文件,但这样您就失去了纯JS的纯净度(无论如何,我不确定您当前是否可以在没有某种Flash变通方法的情况下“将文件拖到浏览器中”——这可能是HTML5的功能吗?)有几种解决方案,但它们依赖于HTML5,并且尚未在某些浏览器中完全实现。下面的示例在Chrome和Firefox中进行了测试(部分有效)
如果您还想为文件提供建议的名称(而不是默认的“下载”),可以在Chrome、Firefox和一些IE版本中使用以下内容:
function downloadURI(uri, name) {
var link = document.createElement("a");
link.download = name;
link.href = uri;
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
delete link;
}
下面的示例显示了它的用途:
downloadURI("data:text/html,HelloWorld!", "helloWorld.txt");
想分享我的经验,帮助那些在Firefox和2014年更新的答案中无法下载的人。 下面的代码段将在firefox和chrome中工作,并接受文件名:
// Construct the <a> element
var link = document.createElement("a");
link.download = thefilename;
// Construct the uri
var uri = 'data:text/csv;charset=utf-8;base64,' + someb64data
link.href = uri;
document.body.appendChild(link);
link.click();
// Cleanup the DOM
document.body.removeChild(link);
//构造元素
var link=document.createElement(“a”);
link.download=文件名;
//构造uri
var uri='数据:text/csv;字符集=utf-8;base64,“+someb64数据
link.href=uri;
document.body.appendChild(链接);
link.click();
//清理DOM
document.body.removeChild(link);
这是我在Firefox和Chrome上测试过的纯JavaScript解决方案,但在Internet Explorer上没有:
function downloadDataUrlFromJavascript(filename, dataUrl) {
// Construct the 'a' element
var link = document.createElement("a");
link.download = filename;
link.target = "_blank";
// Construct the URI
link.href = dataUrl;
document.body.appendChild(link);
link.click();
// Cleanup the DOM
document.body.removeChild(link);
delete link;
}
迄今为止发现的跨浏览器解决方案:
下载->需要闪存
databounce->在IE 10和11中测试过,对我不起作用。需要一个servlet和一些定制。(错误地检测导航器。我必须将IE设置为兼容模式以进行测试,servlet中的默认字符集,JavaScript选项对象的绝对路径具有正确的servlet路径…)对于非IE浏览器,它会在同一窗口中打开文件
download.js->另一个类似但未测试的库。声称是纯JavaScript,不需要servlet或Flash,但对于IE中存在问题的任何人来说,都不适用于IE: 请在这里投票给Yetti的答案:
dataURItoBlob=函数(dataURI){
var binary=atob(dataURI.split(',)[1]);
var数组=[];
对于(var i=0;i
结合@owencm和@Chazt3n的答案,此功能将允许从IE11、Firefox和Chrome下载文本。(很抱歉,我没有Safari或Opera的访问权限,但如果您尝试使用,请添加评论。)
initiate\u user\u download=函数(文件名、mime类型、文本){
//除了我什么都可以
if(未定义===window.navigator.msSaveOrOpenBlob){
var e=document.createElement('a');
var href='data:'+mime_type+';charset=utf-8,'+encodeURIComponent(文本);
e、 setAttribute('href',href);
e、 setAttribute(“下载”,文件名);
文件.正文.附件(e);
e、 单击();
文件.body.removeChild(e);
}
//IE特定代码
否则{
var charCodeArr=新数组(text.length);
对于(变量i=0;i
函数下载(数据URL,文件名){
var a=document.createElement(“a”);
a、 href=dataurl;
a、 setAttribute(“下载”,文件名);
a、 单击();
}
下载(“数据:text/html,HelloWorld!”,“HelloWorld.txt”)代码>仅使用HTML就可以100%完全解决此问题。只需将href
属性设置为数据:(mimetypeheader),(url)
。例如
<a
href="data:video/mp4,http://www.example.com/video.mp4"
target="_blank"
download="video.mp4"
>Download Video</a>
工作示例:
因为我们使用一个数据URL,所以我们可以设置mimetype,它指示要下载的数据类型。文件:
数据URL由四部分组成:前缀(数据:)、指示数据类型的MIME类型、可选的base64标记(如果不是文本标记)以及数据本身。(来源:)
组成部分:
:链接标签
href=“数据:视频/mp4,http://www.example.com/video.mp4“
:我们正在设置指向a数据的链接:
,标题预配置为视频/mp4
。然后是标头mimetype。也就是说,对于.txt
文件,它将是text/plain
。然后是
initiate_user_download = function(file_name, mime_type, text) {
// Anything but IE works here
if (undefined === window.navigator.msSaveOrOpenBlob) {
var e = document.createElement('a');
var href = 'data:' + mime_type + ';charset=utf-8,' + encodeURIComponent(text);
e.setAttribute('href', href);
e.setAttribute('download', file_name);
document.body.appendChild(e);
e.click();
document.body.removeChild(e);
}
// IE-specific code
else {
var charCodeArr = new Array(text.length);
for (var i = 0; i < text.length; ++i) {
var charCode = text.charCodeAt(i);
charCodeArr[i] = charCode;
}
var blob = new Blob([new Uint8Array(charCodeArr)], {type: mime_type});
window.navigator.msSaveOrOpenBlob(blob, file_name);
}
}
// Example:
initiate_user_download('data.csv', 'text/csv', 'Sample,Data,Here\n1,2,3\n');
<a
href="data:video/mp4,http://www.example.com/video.mp4"
target="_blank"
download="video.mp4"
>Download Video</a>
export const downloadAs = async (url: string, name: string) => {
const blob = await axios.get(url, {
headers: {
'Content-Type': 'application/octet-stream',
},
responseType: 'blob',
});
const a = document.createElement('a');
const href = window.URL.createObjectURL(blob.data);
a.href = href;
a.download = name;
a.click();
};