当前位置: 首页 > 知识库问答 >
问题:

无法在“窗口”上执行“atob”

毕和志
2023-03-14

当用户按下ctrl键时,我试图在Chrome中保存HTML文件,但Chrome崩溃了。

(我只想下载HTML文件的源代码)

我读到它发生是因为我的文件比1.99M大...

在第一次尝试中(在我知道Chrome崩溃之前):

function download(filename, text) {
    var pom = document.createElement('a');
    pom.setAttribute('href', 'data:text/plain;charset=utf-8,' + encodeURIComponent(text));
    pom.setAttribute('download', filename);
    pom.click();
}

download('test.html', "<html>" + document.getElementsByTagName('html')[0].innerHTML + "</html>");

第二次尝试,在我读到崩溃后,我使用了blob

function dataURItoBlob(dataURI) {
    var byteString = atob(dataURI.split(',')[1]);

    var mimeString = dataURI.split(',')[0].split(':')[1].split(';')[0]

    var ab = new ArrayBuffer(byteString.length);
    var ia = new Uint8Array(ab);
    for (var i = 0; i < byteString.length; i++) {
        ia[i] = byteString.charCodeAt(i);
    }

    var bb = new BlobBuilder();
    bb.append(ab);
    return bb.getBlob(mimeString);
}

function download(dataURI) {
    var blob = dataURItoBlob(dataURI);
    var url  = window.URL.createObjectURL(blob);
    window.location.assign(url);
}

download("<html>" + document.getElementsByTagName('html')[0].innerHTML + "</html>")

这里我得到了错误:未能在'Window'上执行'atob':要解码的字符串未正确编码。

我不知道,但我读到我需要将我的字符串编码为base 64:如何在JavaScript中将字符串编码为Base64?

有一个148票的答案,我把它贴在我的代码里,不知道怎么继续。

我应该在哪里调用它以及如何调用它?我可以在我保存的文件中输入一个名称吗?

我想我需要做一些事情,比如:

download(_utf8_decode("<html>" + document.getElementsByTagName('html')[0].innerHTML + "</html>"))

共有3个答案

曹鹏海
2023-03-14

您不需要将整个编码字符串传递给atob方法,您需要拆分编码字符串并将所需字符串传递给atob方法

const token= "eyJhbGciOiJIUzUxMiJ9.eyJzdWIiOiJob3NzYW0iLCJUb2tlblR5cGUiOiJCZWFyZXIiLCJyb2xlIjoiQURNSU4iLCJpc0FkbWluIjp0cnVlLCJFbXBsb3llZUlkIjoxLCJleHAiOjE2MTI5NDA2NTksImlhdCI6MTYxMjkzNzA1OX0.8f0EeYbGyxt9hjggYW1vR5hMHFVXL4ZvjTA6XgCCAUnvacx_Dhbu1OGh8v5fCsCxXQnJ8iAIZDIgOAIeE55LUw"
console.log(atob(token.split(".")[1]));
雍兴修
2023-03-14

这里我得到了错误:未能在'Window'上执行'atob':要解码的字符串未正确编码。

因为您没有传递Base64编码的字符串。查看您的函数:installdataURItoBlob出于某种原因都期望数据URI;但是,您正在将纯html标记字符串传递给示例中的install

HTML不仅作为base64无效,而且您正在调用。拆分(',)[1],这将产生未定义的字符串,并且“未定义”也不是有效的base64编码字符串。

我不知道,但我读到我需要将字符串编码为base64

这对我来说没什么意义。你想以某种方式编码它,然后解码它?

我应该打什么电话,怎么打?

将下载函数的界面更改回它接收文件名和文本参数的位置。

请注意,BlobBuilder不仅支持附加整个字符串(因此不需要创建那些数组缓冲区),而且也不支持使用Blob构造函数。

我可以在保存的文件中输入名称吗?

是的。不要使用Blob构造函数,而是File构造函数。

function download(filename, text) {
    try {
        var file = new File([text], filename, {type:"text/plain"});
    } catch(e) {
        // when File constructor is not supported
        file = new Blob([text], {type:"text/plain"});
    }
    var url  = window.URL.createObjectURL(file);
    …
}

download('test.html', "<html>" + document.documentElement.innerHTML + "</html>");

查看JavaScript blob文件名,没有关于如何处理该对象url的链接,只是将当前位置设置为它不起作用。

吕森
2023-03-14

BlobBuilder已过时,请改用Blob构造函数:

URL.createObjectURL(new Blob([/*whatever content*/] , {type:'text/plain'}));

这将返回一个blob URL,然后可以在锚的href中使用该URL。您还可以修改锚点的“下载”属性来操作文件名:

<a href="/*assign url here*/" id="link" download="whatever.txt">download me</a>

摆弄。如果我没记错的话,对受信任的非用户发起的下载有任意限制;因此,我们将坚持使用被视为充分用户发起的链接单击:)

更新:保存当前文档的html实际上非常简单!每当单击我们的交互式链接时,我们都会用相关的blob更新其href。执行单击绑定事件后,将导航到该下载URL!

$('#link').on('click', function(e){
  this.href = URL.createObjectURL(
    new Blob([document.documentElement.outerHTML] , {type:'text/html'})
  );
});

再次拨弄。

 类似资料:
  • 下面是目前为止我所想到的伪代码。任何帮助都将不胜感激!谢谢! 我检查了Table API,但对于流,似乎不支持很多操作,例如OrderBy。

  • 你好,我正在尝试在不同的机器上使用SolrCloud。为此,我审阅了这些文件:这里 但我面临一个问题:无法找到或加载主类org。阿帕奇。动物园管理员。服务器法定人数。windows中的QuorumPeerMain 你能帮助如何在Windows上启动动物园管理员服务器吗? 请注意,我也尝试过在没有start word的情况下使用命令zkServer运行。

  • 我是多克的新手。安装Docker工具箱(操作系统:Windows 10)后,我运行Docker快速入门终端,并在控制台中看到以下内容: 我做错了什么?所有系统和安装步骤的检查都是从这里开始的。 非常感谢您的帮助!

  • 问题内容: 这是我的Javascript代码 这是我的HTML 我遇到错误 错误:无法在“窗口”上执行“ atob”:要解码的字符串未正确编码 问题答案: 我有我的问题。这对于其他用户使用javascript(AnguarJs)保存图像和压缩图像应该会有所帮助。 我正在流动此链接以压缩图像 Github https://github.com/oukan/angular-image- compres

  • 我正在用Tkinter编写一个小程序,想打开两个窗口。然后我想在前面放一扇窗户。程序代码: 我做错了什么new.lift?新密码没有出现在前面:(有人知道如何把窗口放在前面,让窗口聚焦吗?