在使用data:URI时,有什么办法可以指定build议的文件名吗?
例如,如果你按照下面的链接:
data:application/octet-stream;base64,SGVsbG8=
浏览器会提示您下载超链接本身包含base64数据的文件。 有什么办法在标记中提示默认名称? 如果没有,是否有JavaScript解决scheme?
使用download
属性:
<a download='FileName' href='your_url'>
在html5-demos.appspot.com / …上的实例 。
目前适用于 Chrome,Firefox,Edge,Opera,但不适用于Safari 10或IE11。
Chrome现在使这个非常简单:
function saveContent(fileContents, fileName) { var link = document.createElement('a'); link.download = fileName; link.href = 'data:,' + fileContents; link.click(); }
根据RFC 2397 ,不,没有。
也没有看到任何你可以使用的 <a>
元素的属性 。
然而,HTML5后来在<a>
元素中引入了download
属性,尽pipe在编写时支持不是通用的(例如,没有MSIE支持)
仅HTML:使用download
属性:
<a download="logo.gif" href="data:image/gif;base64,R0lGODlhAQABAIAAAAAAAP///yH5BAEAAAAALAAAAAABAAEAAAIBRAA7">Download transparent png</a>
我在netwerk / protocol / data / nsDataHandler.cpp中看了一下firefox的源代码
数据处理程序只parsing内容/types和字符集,并查看string中是否存在“; base64”
rfc指定没有文件名,至lessfirefox没有处理它的文件名,代码生成一个随机的名字加“.part”
我也检查了火狐日志
[b2e140]: DOCSHELL 6e5ae00 InternalLoad data:application/octet-stream;base64,SGVsbG8= [b2e140]: Found extension '' (filename is '', handling attachment: 0) [b2e140]: HelperAppService::DoContent: mime 'application/octet-stream', extension '' [b2e140]: Getting mimeinfo from type 'application/octet-stream' ext '' [b2e140]: Extension lookup on '' found: 0x0 [b2e140]: Ext. lookup for '' found 0x0 [b2e140]: OS gave back 0x43609a0 - found: 0 [b2e140]: Searched extras (by type), rv 0x80004005 [b2e140]: MIME Info Summary: Type 'application/octet-stream', Primary Ext '' [b2e140]: Type/Ext lookup found 0x43609a0
有趣的文件,如果你想看看mozilla来源:
data uri handler: netwerk/protocol/data/nsDataHandler.cpp where mozilla decides the filename: uriloader/exthandler/nsExternalHelperAppService.cpp InternalLoad string in the log: docshell/base/nsDocShell.cpp
我认为你现在可以停止search解决scheme,因为我怀疑没有:)
正如在这个线程中注意到的HTML5具有download
属性,它也适用于Firefox 20 http://www.whatwg.org/specs/web-apps/current-work/multipage/links.html#attr-hyperlink-download
以下Javascript代码片段可以在Chrome中使用链接的新“下载”属性并模拟点击。
function downloadWithName(uri, name) { var link = document.createElement("a"); link.download = name; link.href = uri; link.click(); }
下面的例子显示了它的用法:
downloadWithName("data:,Hello%2C%20World!", "helloWorld.txt")
没有。
整个目的是它是一个数据stream,而不是一个文件。 数据源不应该有用户代理处理它作为一个文件的知识…它不。
你可以添加一个下载属性到锚元素。
样品:
<a download="abcd.cer" href="data:application/stream;base64,MIIDhTC......">down</a>
看看这个链接: http : //lists.w3.org/Archives/Public/uri/2010Feb/0069.html
引用:
它甚至可以和base64一起工作(如在,不会造成问题);最后是base64
像这样(至less在Opera中):数据:文本/无格式;字符集= UTF-8;标头=内容处置%3A%20attachment%3B%20filename%3D%22with%20spaces.txt%22%0D%0AContent语言%3A%20en; base64,4oiaDQo% 3D
在讨论的其他信息中也有一些信息。
Google Code上有一个很小的解决方法脚本,可以帮助我:
http://code.google.com/p/download-data-uri/
它添加一个表单,其中的数据,提交它,然后再次删除表单。 哈克,但它为我做了这个工作。 需要jQuery。
这个主题在谷歌代码页之前出现在谷歌,我认为这也可能有帮助。
这有点骇人,但是我以前也一样。 我在javascript中dynamic生成一个文本文件,并希望通过使用data-URI对其进行编码来提供它。
对于较小的主要用户干预,这是可能的。 生成链接<a href="data:...">right-click me and select "Save Link As..." and save as "example.txt"</a>
。 正如我所说,这是不雅的,但如果你不需要一个专业的解决scheme,它的作品。
这可以通过使用Flash将名称复制到剪贴板中,使其更轻松。 当然,如果你让自己使用Flash或Java(现在越来越less的浏览器支持,我想?),你可能会find另一种方式来做到这一点。
这是一个基于Holf版本的jQuery版本,适用于Chrome和Firefox,而他的版本似乎只适用于Chrome。 添加一些东西给身体做这件事有点奇怪,但如果有人有更好的select,我全力以赴。
var exportFileName = "export-" + filename; $('<a></a>', { "download": exportFileName, "href": "data:," + JSON.stringify(exportData, null,5), "id": "exportDataID" }).appendTo("body")[0].click().remove();
使用服务人员 ,这是真正意义上的可能。
- 创build一个假的URL。 例如/saveAs/myPrettyName.jpg
- 在
<a href, <img src
,window.open(url)中使用URL,完全可以用“真实”URL完成任何事情。 - 在工作人员的内部,抓取提取事件,并用正确的数据进行响应。
即使用户在新选项卡中打开文件,并尝试将其保存在浏览器中,浏览器现在也会提示myPrettyName.jpg。 这就好像文件来自服务器一样。
// In the service worker self.addEventListener( 'fetch', function(e) { if( e.request.url.startsWith( '/blobUri/' ) ) { // Logic to select correct dataUri, and return it as a Response e.respondWith( dataURLAsRequest ); } });
这一个适用于Firefox 43.0(旧版未testing):
dl.js:
function download() { var msg="Hello world!"; var blob = new File([msg], "hello.bin", {"type": "application/octet-stream"}); var a = document.createElement("a"); a.href = URL.createObjectURL(blob); window.location.href=a; }
dl.html
<html lang="en" xmlns="http://www.w3.org/1999/xhtml"> <head> <meta charset="utf-8"/> <title>Test</title> <script type="text/javascript" src="dl.js"></script> </head> <body> <button id="create" type="button" onclick="download();">Download</button> </body> </html>
如果点击button,它提供了一个名为hello.bin的文件供下载。 窍门是使用File而不是Blob 。
参考: https : //developer.mozilla.org/de/docs/Web/API/File
var isIE = /*@cc_on!@*/false || !!document.documentMode; // At least IE6 var sessionId ='\n'; var token = '\n'; var caseId = CaseIDNumber + '\n'; var url = casewebUrl+'\n'; var uri = sessionId + token + caseId + url;//data in file var fileName = "file.i4cvf";// any file name with any extension if (isIE) { var fileData = ['\ufeff' + uri]; var blobObject = new Blob(fileData); window.navigator.msSaveOrOpenBlob(blobObject, fileName); } else //chrome { window.requestFileSystem = window.requestFileSystem || window.webkitRequestFileSystem; window.requestFileSystem(window.TEMPORARY, 1024 * 1024, function (fs) { fs.root.getFile(fileName, { create: true }, function (fileEntry) { fileEntry.createWriter(function (fileWriter) { var fileData = ['\ufeff' + uri]; var blob = new Blob(fileData); fileWriter.addEventListener("writeend", function () { var fileUrl = fileEntry.toURL(); var link = document.createElement('a'); link.href = fileUrl; link.download = fileName; document.body.appendChild(link); link.click(); document.body.removeChild(link); }, false); fileWriter.write(blob); }, function () { }); }, function () { }); }, function () { }); }
答案很简单,即使大多数人都没有想到。
我们可以在下载链接之后添加一个斜杠,并在斜杠后面加上我们需要的文件名。
例如:
<a href"http://foo.goo/xxoo.mp4/nice.mp4"></a>
下载对话框会popup一个默认的文件名nice.mp4,而不是xxoo.mp4
data:URI遵循相同的规则
你可以在Chrome和FireFox中实现这个function。
尝试下面的url,它会下载使用的代码。
data:text/html;base64,PGEgaHJlZj0iZGF0YTp0ZXh0L2h0bWw7YmFzZTY0LFBHRWdhSEpsWmowaVVGVlVYMFJCVkVGZlZWSkpYMGhGVWtVaUlHUnZkMjVzYjJGa1BTSjBaWE4wTG1oMGJXd2lQZ284YzJOeWFYQjBQZ3BrYjJOMWJXVnVkQzV4ZFdWeWVWTmxiR1ZqZEc5eUtDZGhKeWt1WTJ4cFkyc29LVHNLUEM5elkzSnBjSFErIiBkb3dubG9hZD0idGVzdC5odG1sIj4KPHNjcmlwdD4KZG9jdW1lbnQucXVlcnlTZWxlY3RvcignYScpLmNsaWNrKCk7Cjwvc2NyaXB0Pg==