1. ホーム
  2. javascript

[解決済み] ファイル入力フォームからBase64文字列をjavascriptのファイルオブジェクトに変換する方法は?

2022-11-23 19:59:07

質問

ファイルから抽出したBase64String(例:"AAAAA...~")をjavascriptのファイルオブジェクトに変換したいのですが、どうすればよいですか?

javascriptのファイルオブジェクトとは、以下のようなコードです。

HTMLです。

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

JSです。

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

  console.log(file)
}

'file' 変数はjavascriptのファイルオブジェクトです。なので、base64の文字列をこのようにjavascriptのファイルオブジェクトに変換したいのです。

htmlのファイル入力フォームを使わずに、他のアプリがファイルからエンコードしたbase64文字列をデコードしてファイルオブジェクトを取得したいだけなのですが。

ありがとうございます。

どのように解決するのですか?

方法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。 はどのようなタイプのURLでも動作します(http url, dataURL, blobURL, etc...)

 //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);});