【问题标题】:Open Base64 in new tab在新标签页中打开 Base64
【发布时间】:2016-03-24 05:12:12
【问题描述】:

我有一个 Base64 编码的文档,可以是 PDF 文件或图像。 我想在 HTML5 页面中创建一个按钮,在新选项卡中打开这个 base64(或新页面无关紧要)

我发现这段代码可以解决问题:

<a href="http://chriscoyier.net" 
   onclick="window.open(this.href); return false;" 
   onkeypress="window.open(this.href); return false;">
     This link will open in new window/tab
</a>

效果很好。 但是当我用

替换http链接时
href="data:application/octet-stream;base64,/9j/4A.."

然后文件被下载但不显示在浏览器中。

【问题讨论】:

    标签: javascript html base64


    【解决方案1】:

    您的 MIME 类型设置为“application/octet-stream”,通常会下载而不显示(取决于浏览器和系统设置)。如果您尝试加载浏览器可显示的内容,那么您应该为您的内容使用更合适的 MIME 类型,以便它内嵌显示并且不会被下载。

    请注意:As of Chrome 60和一个upcoming version of FireFox(虽然出现了FireFoxwill still support images),数据URI不能在浏览器的顶层框架中打开(和it was never supported in IE/Edge),但是可以打开在 iframe 和 img 元素中。

    以下解决方法已在上述浏览器的最新版本中测试并运行。这也可以用 img 标签重写以显示图像。

    <button id='btnDownload'>Download</button>
    
    document.getElementById('btnDownload').addEventListener('click', function(){
        var w = window.open('about:blank');
    
        setTimeout(function(){ //FireFox seems to require a setTimeout for this to work.
            w.document.body.appendChild(w.document.createElement('iframe'))
                .src = 'data:application/octet-stream;base64,SWYgSSBoYWQgYSBuaWNrbGUgZm9yIGV2ZXJ5IHRpbWUgSSBoYWQgYSBuaWNrbGUsIEknZCBoYXZlIGVhdGVuIHR3aWNlIGFzIG1hbnkgcGlja2xlcy4=';
        }, 0);
    });
    

    但是,如果您的意图只是下载内容(与问题中陈述的意图相反,但通常适用于“应用程序/八位字节流”内容),这应该足够了:

    <a href='data:application/octet-stream;base64,SWYgSSBoYWQgYSBuaWNrbGUgZm9yIGV2ZXJ5IHRpbWUgSSBoYWQgYSBuaWNrbGUsIEknZCBoYXZlIGVhdGVuIHR3aWNlIGFzIG1hbnkgcGlja2xlcy4=' download>Download this</a>
    

    【讨论】:

    • 注意:在第一种情况下(将其放入新窗口的 iframe 或图像标签中),用户将无法下载图像。
    • 我的意思是:@Aaron,你能帮我让 iframe 填满浏览器窗口吗?
    【解决方案2】:

    在 chrome 和 Firefox 上测试,只需将 base64 值添加到 href 属性中即可(没有 onclick 和 onkeypress 事件)。就这样:

    <html>
    
    <body>
      <a href="data:image/gif;base64,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">test</a>
    </body>
    
    </html>

    【讨论】:

    • 感谢您的回答。我已经在 chrome 和 safari 上测试了我在 iPad 上拥有的东西,而且效果很好。由于网络浏览器首选项,它似乎在我的计算机上不起作用。可能是。顺便说一句,如果它可以帮助你,我使用“data:application/octet-stream;base64”来忽略我的base64是什么类型的文件。
    • 此解决方案不适用于 IE。是否有任何替代解决方案可以在 IE 中实现此功能?
    • 这在 Chrome 中不再有效,并且在 Firefox 中也将停止工作。有关详细信息,请参阅我的答案。
    • 我刚刚在 chrome 中运行了该代码 sn-p,我看到了一条红色的小巴士
    • 控制台中的chrome显示错误:不允许将顶部框架导航到数据URL:
    【解决方案3】:

    我正在根据 Aaron 的回答添加我的问题的答案:

    document.getElementById('btnDownload').addEventListener('click', function(){
        var w = window.open('about:blank');
        setTimeout(function(){ //FireFox seems to require a setTimeout for this to 
        work.
    
            w.document.body.appendChild(w.document.createElement('iframe'))
                .src = $this.attr('href');
            w.document.getElementsByTagName("iframe")[0].style.width = '100%';
            w.document.getElementsByTagName("iframe")[0].style.height = '100%';
        }, 0);
    });
    

    【讨论】:

      【解决方案4】:
          <a href="aHR0cHM6Ly93d3cuc3dpdGNoLXRvcnJlbnRzLmNvbS9kb3dubG9hZC80MTMvU3VwZXIlMjBTbWFzaCUyMEJyb3MlMjBVbHRpbWF0ZS50b3JyZW50" 
           onclick="window.open(this.href); return false;" 
           onkeypress="window.open(this.href); return false;">
             This link will open in new window/tab
          </a>
      

      【讨论】:

      • 请在代码中添加对解决方案的描述。
      猜你喜欢
      • 2019-12-28
      • 1970-01-01
      • 1970-01-01
      • 2012-05-09
      • 2016-07-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多