如何将Base64 String转换为javascript文件对象,就像从文件输入形式一样?

2022-08-30 04:30:21

我想将从文件中提取的Base64String(例如:“AAAAA....~”)转换为javascript文件对象。

javascript文件对象的意思是像这样的代码:

网页:

<input type="file" id="selectFile" > 

JS:

$('#selectFile').on('change', function(e) {
  var file = e.target.files[0];

  console.log(file)
}

'file' 变量是一个 javascript 文件对象。所以我想像这样将base64字符串转换为javascript文件对象。

我只想通过解码base64字符串(由其他应用程序从文件中编码)而不使用html文件输入表单来获取文件对象。

谢谢。


答案 1

方式1:仅适用于dataURL,不适用于其他类型的URL。

 function dataURLtoFile(dataurl, filename) {
 
        var arr = dataurl.split(','),
            mime = arr[0].match(/:(.*?);/)[1],
            bstr = atob(arr[1]), 
            n = bstr.length, 
            u8arr = new Uint8Array(n);
            
        while(n--){
            u8arr[n] = bstr.charCodeAt(n);
        }
        
        return new File([u8arr], filename, {type:mime});
    }
    
    //Usage example:
    var file = dataURLtoFile('data:text/plain;base64,aGVsbG8gd29ybGQ=','hello.txt');
    console.log(file);

方式2:适用于任何类型的网址(http网址,dataURL,blobURL等)

 //return a promise that resolves with a File instance
    function urltoFile(url, filename, mimeType){
        return (fetch(url)
            .then(function(res){return res.arrayBuffer();})
            .then(function(buf){return new File([buf], filename,{type:mimeType});})
        );
    }
    
    //Usage example:
    urltoFile('data:text/plain;base64,aGVsbG8gd29ybGQ=', 'hello.txt','text/plain')
    .then(function(file){ console.log(file);});

答案 2
const url = 'data:image/png;base6....';
fetch(url)
  .then(res => res.blob())
  .then(blob => {
    const file = new File([blob], "File name",{ type: "image/png" })
  })

Base64 字符串 -> Blob -> 文件。