我有一个文件上传器输入,在这里我接受一个文件,将其转换为64位字符串,然后将有效载荷发送到rest api。
但是,当我为utf-8文件编码base64时,它工作正常。但是,如果我尝试获取“ window-1251”文件的base64字符串,则无法正确转换为字符串,并且api会引发错误,因为base64字符串无效。
所以我的问题是如何获取使用window-1251进行编码的文件的base64字符串?
generator.__next__()
答案 0 :(得分:1)
对不起,但前提没有道理。 FileReader.readAsDataURL 将始终从您提供给它的内容中返回一个有效的base64字符串=>二进制数据。
这些字节代表具有给定编码的文本文件这一事实被算法忽略了。
const rand_data = crypto.getRandomValues(new Uint8Array(50));
const blob = new Blob([rand_data]);
const reader = new FileReader();
reader.onload = e => {
const dataURL = reader.result
const base64 = dataURL.slice(dataURL.indexOf(',')+1);
console.log(base64);
console.log(atob(base64)); // would throw if invalid data
};
reader.readAsDataURL(blob);
因此,您正在寻找问题的错误结尾:使用者在读取Windows-1251编码的文本文件时可能会遇到问题,但这不是FileReader的错。
现在,如果您愿意在浏览器中将这种编码转换为UTF-8,那么仍然可以实现,但是您需要一种方法来知道给定的文件采用哪种编码。
const win_1251 = new Blob([Uint8Array.from([200])]); // И in windows-1251
// to prove it's not UTF-8
readUTF8Text(win_1251); // �
const reencode_reader = new FileReader();
reencode_reader.onload = e => {
const utf_8_arr = new TextDecoder('windows-1251')
.decode(new Uint8Array(reencode_reader.result));
const utf_8 = new Blob([utf_8_arr], {type: 'text/plain'})
makeDataURL(utf_8);
readUTF8Text(utf_8); // И
};
reencode_reader.readAsArrayBuffer(win_1251);
function makeDataURL(blob) {
const reader = new FileReader();
reader.onload = e => {
console.log(reader.result);
};
reader.readAsDataURL(blob);
}
function readUTF8Text(blob) {
const reader = new FileReader();
reader.onload = e => {
console.log(reader.result);
};
reader.readAsText(blob);
}