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

Vas*_*yov 140 javascript base64

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

file = document.querySelector('#files > input[type="file"]').files[0]
Run Code Online (Sandbox Code Playgroud)

我需要通过基础64中的json发送此文件.我应该怎么做才能将它转换为base64字符串?

Dmi*_*tin 260

尝试使用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
Run Code Online (Sandbox Code Playgroud)

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

  • 我试图从`getBase64()`函数使用`return reader.result`(而不是使用`console.log(reader.result)`)因为我想将base64捕获为变量(然后将其发送给Google应用脚本).我调用了函数:`var my_file_as_base64 = getBase64(file)`然后尝试使用`console.log(my_file_as_base64)`打印到控制台,然后得到`undefined`.如何正确地将base64分配给变量? (5认同)
  • 阅读有关 FileReader API 的更多信息:https://developer.mozilla.org/en-US/docs/Web/API/FileReader 和浏览器支持:http://caniuse.com/#feat=filereader (2认同)
  • 如果有人可以回答,我从上面的评论中提出了一个问题。/sf/ask/3303658361/ (2认同)

jos*_*ing 115

如果您正在使用基于承诺的解决方案,这是@ 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)
);
Run Code Online (Sandbox Code Playgroud)


Arn*_*d P 32

建立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);
  });
}
Run Code Online (Sandbox Code Playgroud)

  • Chrome 69,第一个替换是捕获空文件,第二个替换是缺少逗号 - encoded = reader.result.replace("data:","").replace(/^.*; base64,/,""); (2认同)
  • 我有一个更简单的版本:`resolve(reader.result.replace(/^.*,/,``)));`。由于逗号',`在base64字母之外,因此我们可以剥离出现的所有内容,直到并包括逗号。/sf/answers/923665291/ (2认同)

Дми*_*ьев 27

现代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();
Run Code Online (Sandbox Code Playgroud)

UPD:

如果您想捕捉错误

async function Main() {
   const file = document.querySelector('#myfile').files[0];
   const result = await toBase64(file).catch(e => e);
   if(result instanceof Error) {
      console.log('Error: ', result.message);
      return;
   }
   //...
}
Run Code Online (Sandbox Code Playgroud)

  • 此代码不正确。如果你“await”一个返回被拒绝的 Promise 的函数,你不会得到调用返回的错误;它会被抛出,你需要接住它。 (8认同)
  • 我实际上尝试了这个片段试图转换 <input type='file' /> 上的图像并收到错误。:Users.js:41未捕获(承诺)TypeError:无法在“FileReader”上执行“readAsDataURL”:参数1不是“Blob”类型。 (3认同)

Pra*_*iar 11

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

  • 你将不得不首先读取文件,然后将其传递给这个函数..像http://jsfiddle.net/eliseosoto/JHQnk/ (7认同)
  • btoa仅适用于字符串.如何与文件一起使用? (5认同)
  • @PranavManiar 你的小提琴不再有效。你能更新链接吗? (3认同)

tkd*_*_aj 8

以下是我编写的几个函数,用于获取可以轻松传递的 json 格式的文件:

    //takes an array of JavaScript File objects
    function getFiles(files) {
        return Promise.all(files.map(file => getFile(file)));
    }

    //take a single JavaScript File object
    function getFile(file) {
        var reader = new FileReader();
        return new Promise((resolve, reject) => {
            reader.onerror = () => { reader.abort(); reject(new Error("Error parsing file"));}
            reader.onload = function () {

                //This will result in an array that will be recognized by C#.NET WebApi as a byte[]
                let bytes = Array.from(new Uint8Array(this.result));

                //if you want the base64encoded file you would use the below line:
                let base64StringFile = btoa(bytes.map((item) => String.fromCharCode(item)).join(""));

                //Resolve the promise with your custom file structure
                resolve({ 
                    bytes: bytes,
                    base64StringFile: base64StringFile,
                    fileName: file.name, 
                    fileType: file.type
                });
            }
            reader.readAsArrayBuffer(file);
        });
    }

    //using the functions with your file:

    file = document.querySelector('#files > input[type="file"]').files[0]
    getFile(file).then((customJsonFile) => {
         //customJsonFile is your newly constructed file.
         console.log(customJsonFile);
    });

    //if you are in an environment where async/await is supported

    files = document.querySelector('#files > input[type="file"]').files
    let customJsonFiles = await getFiles(files);
    //customJsonFiles is an array of your custom files
    console.log(customJsonFiles);
Run Code Online (Sandbox Code Playgroud)


Om *_*uke 6

const fileInput = document.querySelector('input');

fileInput.addEventListener('change', (e) => {

// get a reference to the file
const file = e.target.files[0];

// encode the file using the FileReader API
const reader = new FileReader();
reader.onloadend = () => {

    // use a regex to remove data url part
    const base64String = reader.result
        .replace('data:', '')
        .replace(/^.+,/, '');

    // log to console
    // logs wL2dvYWwgbW9yZ...
    console.log(base64String);
};
reader.readAsDataURL(file);});
Run Code Online (Sandbox Code Playgroud)


Cyb*_*ogs 5

打字稿版本

const file2Base64 = (file:File):Promise<string> => {
    return new Promise<string> ((resolve,reject)=> {
         const reader = new FileReader();
         reader.readAsDataURL(file);
         reader.onload = () => resolve(reader.result.toString());
         reader.onerror = error => reject(error);
     })
    }
Run Code Online (Sandbox Code Playgroud)

  • reader.result 可能为 null,并且会出现打字稿错误。此代码处理这种情况: `reader.onload = () =&gt; revok(reader.result ? reader.result.toString() : '')` (2认同)
  • 为了防止“Object is possible 'null'”错误,您可以使用可选链接运算符,例如“reader.onload = () =&gt; resolve(reader.result?.toString() || '');” (2认同)