在使用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(); 

使用服务人员 ,这是真正意义上的可能。

  1. 创build一个假的URL。 例如/saveAs/myPrettyName.jpg
  2. <a href, <img src ,window.open(url)中使用URL,完全可以用“真实”URL完成任何事情。
  3. 在工作人员的内部,抓取提取事件,并用正确的数据进行响应。

即使用户在新选项卡中打开文件,并尝试将其保存在浏览器中,浏览器现在也会提示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==