如何在 JavaScript 中将文件转换为 base64?

IT技术 javascript base64
2021-01-11 20:11:42

UPD TypeScript 版本也可在答案中找到

现在我通过这一行获取 File 对象:

file = document.querySelector('#files > input[type="file"]').files[0]

我需要通过 json 在 base64 中发送这个文件。我应该怎么做才能将它转换为 base64 字符串?

6个回答

尝试使用FileReader 的解决方案

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

请注意,这.files[0]是一个File类型,它是 的子类Blob因此它可以与FileReader.
请参阅完整的工作示例

阅读有关 FileReader API 的更多信息:developer.mozilla.org/en-US/docs/Web/API/FileReader和浏览器支持:caniuse.com/#feat=filereader
2021-03-14 20:11:42
2021-03-17 20:11:42
如果有人可以回答,我从上面的评论中提出了一个问题。 stackoverflow.com/questions/47195119/...
2021-03-22 20:11:42
我尝试使用return reader.resultfromgetBase64()函数(而不是使用console.log(reader.result)),因为我想将 base64 捕获为变量(然后将其发送到 Google Apps 脚本)。我用: 调用了这个函数,var my_file_as_base64 = getBase64(file)然后尝试打印到控制台,console.log(my_file_as_base64 )然后就得到了undefined. 如何将 base64 正确分配给变量?
2021-03-31 20:11:42
我需要在浏览器中用相同的文件名打开这个 Base64 文件,我正在使用 window.open(url, '_blank') 打开它,它工作正常,我如何给文件名?请帮忙。
2021-04-07 20:11:42

现代 ES6 方式(异步/等待)

const toBase64 = file => new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => resolve(reader.result);
    reader.onerror = error => reject(error);
});

async function Main() {
   const file = document.querySelector('#myfile').files[0];
   console.log(await toBase64(file));
}

Main();

更新:

如果你想捕捉错误

async function Main() {
   const file = document.querySelector('#myfile').files[0];
   const result = await toBase64(file).catch(e => Error(e));
   if(result instanceof Error) {
      console.log('Error: ', result.message);
      return;
   }
   //...
}
我实际上尝试了这个片段,试图在 <input type='file' /> 上转换图像并得到一个错误。:Users.js:41 Uncaught (in promise) TypeError:无法在“FileReader”上执行“readAsDataURL”:参数 1 不是“Blob”类型。
2021-03-15 20:11:42
使用异步函数和Promise的好例子
2021-03-16 20:11:42
此代码不正确。如果你await的函数返回一个被拒绝的 Promise,你不会得到调用返回的错误;它会被抛出,你需要抓住它。
2021-03-21 20:11:42

如果您使用的是基于 Promise 的解决方案,那么@Dmitri 的代码适用于此:

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

var file = document.querySelector('#files > input[type="file"]').files[0];
getBase64(file).then(
  data => console.log(data)
);
我需要在浏览器中用相同的文件名打开这个 Base64 文件,我正在使用 window.open(url, '_blank') 打开它,它工作正常,我如何给文件名?请帮忙。
2021-03-14 20:11:42

基于 Dmitri Pavlutin 和 joshua.paling 的答案,这里有一个扩展版本,它提取 base64 内容(删除开头的元数据)并确保正确完成填充

function getBase64(file) {
  return new Promise((resolve, reject) => {
    const reader = new FileReader();
    reader.readAsDataURL(file);
    reader.onload = () => {
      let encoded = reader.result.toString().replace(/^data:(.*,)?/, '');
      if ((encoded.length % 4) > 0) {
        encoded += '='.repeat(4 - (encoded.length % 4));
      }
      resolve(encoded);
    };
    reader.onerror = error => reject(error);
  });
}
Chrome 69,第一个替换是捕获空文件,第二个替换缺少逗号 - encoding = reader.result.replace("data:", "").replace(/^.*;base64,/, "");
2021-04-01 20:11:42
我有一个更简单的版本:resolve(reader.result.replace(/^.*,/, ''));由于昏迷,不在 base64 字母表之外,我们可以去除出现在昏迷之前的任何内容。stackoverflow.com/a/13195218/1935128
2021-04-04 20:11:42
@ArnaudP typescript错误:类型 'string | 上不存在属性 'replace' 数组缓冲区'。
2021-04-06 20:11:42
我的话,我确实错过了那个昏迷。令人难以置信的是,它似乎根本没有打扰我的后端,我仍然能够成功上传excel文件o_O。我已经修复了正则表达式以将您的空文件用例也考虑在内。谢谢。
2021-04-07 20:11:42
好的,谢谢提醒,虽然根据我在这里写的正则表达式(我需要再次试验以确保),可能只有data:, 没有任何逗号,所以我会保持第一部分不变。我已经相应地更新了答案。
2021-04-09 20:11:42

JavaScript btoa()函数可用于将数据转换为 base64 编码的字符串

<div>
    <div>
        <label for="filePicker">Choose or drag a file:</label><br>
        <input type="file" id="filePicker">
    </div>
    <br>
    <div>
        <h1>Base64 encoded version</h1>
        <textarea id="base64textarea" 
                  placeholder="Base64 will appear here" 
                  cols="50" rows="15"></textarea>
    </div>
</div>
var handleFileSelect = function(evt) {
    var files = evt.target.files;
    var file = files[0];

    if (files && file) {
        var reader = new FileReader();

        reader.onload = function(readerEvt) {
            var binaryString = readerEvt.target.result;
            document.getElementById("base64textarea").value = btoa(binaryString);
        };

        reader.readAsBinaryString(file);
    }
};

if (window.File && window.FileReader && window.FileList && window.Blob) {
    document.getElementById('filePicker')
            .addEventListener('change', handleFileSelect, false);
} else {
    alert('The File APIs are not fully supported in this browser.');
}
@PranavManiar 你的小提琴不再有效。你能更新链接吗?
2021-03-18 20:11:42
您必须先读取文件,然后将其传递给此函数.. 类似于jsfiddle.net/eliseosoto/JHQnk
2021-03-26 20:11:42
btoa 仅适用于字符串。如何与文件一起使用?
2021-03-29 20:11:42