我是 JS 新手,我必须在工作中做一个功能,我不太清楚如何处理它。
我有一个表单,用户可以在其中动态添加项目并按下按钮。其中一个按钮允许添加输入以上传文件。为了方便起见,我将把 HTML 恢复为这样的:
原始 div 的形式是:
<div id="userContent">
</div>
当用户按下按钮时,它会添加元素,在这种情况下文件输入:
<div id="userContent">
<div id="inputFile-1" class="customTabContent">
<input id="file-1" type="file" required="required">
</div>
<div id="inputFile-2" class="customTabContent">
<input id="file-2" type="file" required="required">
</div>
<div id="inputFile-3" class="customTabContent">
<input id="file-3" type="file" required="required">
</div>
</div>
当用户完成添加元素并按下按钮提交数据时,我读取 DOM 并查看创建用户的内容,首先我获得了父级:
var parent = document.getElementById('userContent');
然后,我遍历孩子,并为每个孩子我得到输入:
var input = document.getElementById('file-1');
var file = input.files[0];
然后我使用这个函数读取文件并返回base64中的值,使用closures
获取值:
function getBase64(file) {
var base64data = null;
var fileReader = new FileReader();
fileReader.onloadend = (function () {
return function () {
var rawData = fileReader.result;
/* Remove metadata */
var cleanedData = rawData.replace(/^data:(.*;base64,)?/, '');
/* Ensure padding if the input length is not divisible by 3 */
if ((cleanedData.length % 4) > 0) {
cleanedData += '='.repeat(4 - (cleanedData.length % 4));
}
base64data = cleanedData;
}
})();
fileReader.readAsDataURL(file);
return base64data;
}
我的问题是,这家网站上,我得到一个错误,指出base64data
它的null
,但如果我把一个断点上return base64data;
,在年底getBase64(file)
的变量对BASE64的值,如果我释放调试器,我可以将值发送到服务器。
阅读文档,FileReader它是异步的,所以我认为问题似乎与它有关,但是我怎样才能实现我想要做的事情?我不知道为什么在调试器上我可以获得值,但在调试器之外没有。我很困....
问候。
PD:如果我不回答,那是因为我不在工作,所以很抱歉延迟回复。
-------- 编辑 1
多亏了Sjoerd de Wit
我可以获得结果,但我无法分配给变量:
var info = {'type': '', 'data': ''};
........
} else if (it_is_a_file) {
var file = input.files[0];
var base64data = null;
getBase64(file).then((result) => {
base64data = result;
info['type'] = 'file';
info['data'] = base64data;
});
} else if
.......
return info;
但在info
我得到{'type': '', 'data': ''}
. 我用错了承诺?谢谢。
-------- 编辑 2
这个问题是因为作为 JavaScript 的菜鸟,我不知道使用 FLASK,您必须使用表单并以不同的方式获取数据。
因此,这个问题的答案是搜索如何从FORM
with获取数据FLASK
。
但是我会将答案标记为正确,因为您可以获得我所要求的价值。
您可以将函数转换为返回承诺,然后在加载时解析 base64data。
function getBase64(file) {
return new Promise((resolve, reject) => {
var fileReader = new FileReader();
fileReader.onloadend = (function () {
return function () {
var rawData = fileReader.result;
/* Remove metadata */
var cleanedData = rawData.replace(/^data:(.*;base64,)?/, '');
/* Ensure padding if the input length is not divisible by 3 */
if ((cleanedData.length % 4) > 0) {
cleanedData += '='.repeat(4 - (cleanedData.length % 4));
}
resolve(cleanedData);
}
})();
fileReader.readAsDataURL(file);
});
}
然后你想在哪里阅读它,你可以这样做:
getBase64(file).then((base64data) => {
console.log(base64data);
})
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句