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

如何捕获FileReader base64作为变量?

万俟靖
2023-03-14

这将base64打印到控制台:

function getBase64(file) {
    var reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = function() {
        console.log(reader.result);
    };
    reader.onerror = function(error) {
        console.log('Error: ', error);
    };
}

var file = document.querySelector('#files > input[type="file"]').files[0];
getBase64(file); // prints the base64 string

来源:https://stackoverflow.com/A/36281449/1063287

我希望能够将base64赋值给一个变量,所以我尝试了以下操作,基于这个答案:

function getBase64(file, onLoadCallback) {
    var reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = onLoadCallback;
    reader.onerror = function(error) {
        console.log('Error when converting PDF file to base64: ', error);
    };
}

var my_pdf_file = document.querySelector("#my_pdf_file").files[0];
var my_pdf_file_as_base64 = "";
getBase64(my_pdf_file, function(e) {
    my_pdf_file_as_base64 = e.target.result
});

// print out the base64 to show i have captured the value correctly
console.log(my_pdf_file_as_base64);

它目前没有向控制台打印任何内容。

问题:

我正在提交一个表单在谷歌应用程序脚本环境。

我以前已经这样做了,并将一个表单对象(包括一个文件)传递给Google Apps脚本函数。

但是,这种方法的一个约束条件是,如果将表单对象作为参数传递,则它是唯一允许的参数。

针对@aasmund的伟大回答,我希望变量赋值阻止进一步的代码执行:

var my_pdf_file = [ converted file here ];

// don't do this stuff until the above variable is assigned

否则,我将不得不重构发生在then块中的剩余代码(由@aasmund建议),由于在提交表单之前要进行大量的验证/变量准备/条件处理,这可能会很混乱/不可能。

共有1个答案

秦胡媚
2023-03-14

fileReader.readAsDataurl()是异步的-下载在后台进行,而其余代码则继续执行。因此,console.log(my_pdf_file_as_base64);打印空字符串的原因是,行my_pdf_file_as_base64=e.target.result尚未执行:对getbase64()的调用几乎立即完成,并执行后续语句;只有稍后(下载完成时)才会执行回调。

处理这种情况的方法是将使用下载文件的代码放置在回调内部:

getBase64(my_pdf_file, function(e) {
    my_pdf_file_as_base64 = e.target.result;
    console.log(my_pdf_file_as_base64);
});

或者,您可以重复地(例如,在settimeout回调或在某些DOM事件处理程序内)检查reader.readystate===fileReader.done-只要该值变为true,则reader.result将包含该文件。

更灵活的方法是使用promise,这是一个封装异步计算的对象:

function getBase64(file, onLoadCallback) {
    return new Promise(function(resolve, reject) {
        var reader = new FileReader();
        reader.onload = function() { resolve(reader.result); };
        reader.onerror = reject;
        reader.readAsDataURL(file);
    });
}

var promise = getBase64(my_pdf_file);
promise.then(function(result) {
    console.log(result);
});

到目前为止,这看起来与第一种解决方案非常相似,但优点是promise是一个对象,您可以将其传递给其他函数,这样您就可以在一个地方开始计算,并在另一个地方决定计算完成后应该发生什么。

您可能已经注意到,这两种方法都不允许您阻止进一步的代码执行,直到将文件内容分配给全局变量my_pdf_file_as_base64。这是故意的;但是,如果您真的真的需要阻止html" target="_blank">下载,因为您没有时间重构旧代码,请参阅https://stackoverflow.com/A/39914235/626853中的讨论。如果用户的浏览器足够现代化,则可以使用Async/Await:

$(document).on("click", ".clicker", async function() {
    var promise = getBase64(my_pdf_file);
    var my_pdf_file_as_base64 = await promise;
}

(请注意,await仅在async函数中工作,因此单击处理程序必须是async。我还尝试添加了一个繁忙的等待循环,但这导致浏览器挂起。)

 类似资料:
  • 问题内容: 我正在使用以下代码使用nodejs和ssh2模块在Linux机器上重置密码: 我正在从另一个模块(如下所示的test.js)调用resetPassword密码功能。 但是console.log说“未定义”。尝试使用process.nextTick,但没有运气。请帮忙。 问题答案: 欢迎来到node.js中使用异步操作进行开发的世界。最初学习node.js时,这是一个非常常见的错误(也是

  • 问题内容: 我正在生成大量的XML,当用户单击表单按钮时,这些XML将作为发布变量传递到API。我还希望能够事先向用户显示XML。 该代码有点像以下结构: 我的XML正在生成一些while循环和其他内容。然后需要在两个位置(预览和表单值)中显示它。 我的问题是。我如何在变量中捕获生成的XML或其他内容,所以我只需要生成一次,然后将其打印出来就可以在预览中生成,然后在表单值中生成? 问题答案:

  • 问题内容: 在node.js中,readFile()显示了如何捕获错误,但是对于readFileSync()函数,有关错误处理没有任何注释。这样,如果我在没有文件的情况下尝试使用readFileSync(),则会收到错误消息。 如何捕获抛出的异常?Doco没有说明抛出了什么异常,所以我不知道需要捕获哪些异常。我应该注意,我不喜欢普通的“捕获每个可能的异常”样式的try / catch语句。在这种情

  • 我已经在tomcat 7.0.55中部署了一个应用程序进行测试。我想捕获“HeapDumpOnOutOfMemoryError”是否正在发生。以下是我的JVM参数。 JAVA_OPTS="-server-Xms512M-Xmx2048M-XX: PermSize=256m-XX: MaxPermSize=512m-XX: UseConcMarkSweepGC-XX: UseParNewGC-XX:

  • 问题内容: 我在Oracle数据库中有一个交易表。我正在尝试为涉及多种交易类型的交付系统收集一份报告。实际上,“请求”类型可以是四个子类型之一(在此示例中为“ A”,“ B”,“ C”和“ D”),而“传递”类型可以是四个不同子类型之一类型(“ PULL”,“ PICKUP”,“ MAIL”)。从“请求”到“交付”之间可以有1到5个事务,并且“交付”类型中的许多也是中间事务。 我需要的是像这样的报

  • 问题内容: 我有一个Java 7程序,该程序加载成千上万个对象(组件),每个对象具有许多参数(存储在中),并在这些对象上执行各种Rhino脚本以计算其他派生参数,这些参数又存储回该对象的中。在运行每个脚本之前,将创建一个对象,该对象由该对象的映射支持,该映射在脚本运行期间用作JavaScript的作用域。 作为一个简单的示例,以下代码创建一个a = 10和b = 20的代码,并执行脚本,结果将其存