画像をBase64に変換


85
<input type="file" id="asd"/>

base64で画像を取得したいユーザーが選択したら(フォームを送信する前に)

何かのようなもの :

$(input).on('change',function(){
  var data = $(this).val().base64file(); // it is not a plugin is just an example
  alert(data);
});

File APIやその他のものについて読みましたが、シンプルでクロスブラウザなソリューションが欲しいです(IE6 / IE7は明らかに除外されています)

どんな助けでも感謝します。


1
そして、HTML5ファイルAPIについて何を理解していませんでしたか?何を試しましたか?何がうまくいかなかったのですか?
epascarello 2013

@epascarello彼らは完全には、実際にサポートされていませんcaniuse.com/#feat=fileapi私はAndroidのバージョンはまだ(旧バージョン)を使用している、特に原因、回避策を必要とするだけでなく、古いIOSバージョンのために、と私はまた、IE9が関与したいと思われますまだたくさん使われています:P
大げさな

何のための回避策?ファイルで何をしようとしていますか?base64file()-それはプラグインですか?
David Hellsing 2013

@Davidユーザーが自分のPCからファイルを選択したら、base64ファイルを取得したいだけです。base64file()は単なる例です
大げさな

1
@epascarelloええ、それはまさに私の質問でした。すべてのブラウザをサポートする方法:D
大げさな2013

回答:


210

function readFile() {
  
  if (this.files && this.files[0]) {
    
    var FR= new FileReader();
    
    FR.addEventListener("load", function(e) {
      document.getElementById("img").src       = e.target.result;
      document.getElementById("b64").innerHTML = e.target.result;
    }); 
    
    FR.readAsDataURL( this.files[0] );
  }
  
}

document.getElementById("inp").addEventListener("change", readFile);
<input id="inp" type='file'>
<p id="b64"></p>
<img id="img" height="150">

PS: base64でエンコードされた画像(文字列)元の画像データの4/3のサイズ)

複数の画像のアップロードについては、この回答を確認してください

ブラウザのサポート:http//caniuse.com/#search=file%20api
詳細はこちら:https//developer.mozilla.org/en-US/docs/Web/API/FileReader


2
はい、ありがとうございます。実際、ファイルリーダーが完全にサポートされていないことがわかります。古いAndroid / iOSデバイスでも同じようにサポートするにはどうすればよいですか?
大げさな2013

1
他にブラウザはありますか?xD
RicardoE 2014年

これは、画像からbase64への変換のための本当にすてきなコードでした。これをjavascriptで画像に戻すことはできますか?私は..前に使用をbase64エンコード・デコードをしましたが、画像の変換についてどんな考えを持っていけない
コーダ

@TheCoderこれをbase64文字列としてimgsrcに直接配置できます。画像データを取得するには、キャンバスコンテキストを使用します。
Qwerty

1
@bombastic JSを使用して、iOSとAndroidの両方のアプリを両方のプラットフォームでビルドしました。iOSは正常であり、Androidでは、ギャラリーへのアクセス許可を取得するためにネイティブコードが必要でした...
Osman Gani KhanMasum19年

36

まさに必要なもの:)コールバックバージョンまたはPromiseバージョンを選択できます。promiseは、Promise polyfill libを使用するIEでのみ機能することに注意してください。このコードをページに1回配置すると、この関数がすべてのファイルに表示されます。

loadendイベントは、リソースのロードの進行が停止したときに発生します(たとえば、「エラー」、「中止」、または「ロード」がディスパッチされた後)。

コールバックバージョン

        File.prototype.convertToBase64 = function(callback){
                var reader = new FileReader();
                reader.onloadend = function (e) {
                    callback(e.target.result, e.target.error);
                };   
                reader.readAsDataURL(this);
        };

        $("#asd").on('change',function(){
          var selectedFile = this.files[0];
          selectedFile.convertToBase64(function(base64){
               alert(base64);
          }) 
        });

プロミスバージョン

    File.prototype.convertToBase64 = function(){
         return new Promise(function(resolve, reject) {
                var reader = new FileReader();
                reader.onloadend = function (e) {
                    resolve({
                      fileName: this.name,
                      result: e.target.result, 
                      error: e.target.error
                    });
                };   
                reader.readAsDataURL(this);
        }.bind(this)); 
    };

    FileList.prototype.convertAllToBase64 = function(regexp){
      // empty regexp if not set
      regexp = regexp || /.*/;
      //making array from FileList
      var filesArray = Array.prototype.slice.call(this);
      var base64PromisesArray = filesArray.
           filter(function(file){
             return (regexp).test(file.name)
           }).map(function(file){
             return file.convertToBase64();
           });
      return Promise.all(base64PromisesArray);
    };

    $("#asd").on('change',function(){
      //for one file
      var selectedFile = this.files[0];
      selectedFile.convertToBase64().
          then(function(obj){
            alert(obj.result);
          });
      });
      //for all files that have file extention png, jpeg, jpg, gif
      this.files.convertAllToBase64(/\.(png|jpeg|jpg|gif)$/i).then(function(objArray){
            objArray.forEach(function(obj, i){
                  console.log("result[" + obj.fileName + "][" + i + "] = " + obj.result);
            });
      });
    })

html

<input type="file" id="asd" multiple/>

8
<input type="file" onchange="getBaseUrl()">
function getBaseUrl ()  {
    var file = document.querySelector('input[type=file]')['files'][0];
    var reader = new FileReader();
    var baseString;
    reader.onloadend = function () {
        baseString = reader.result;
        console.log(baseString); 
    };
    reader.readAsDataURL(file);
}

1
'file'が宣言されていますが、その値がgetBaseUrl()関数内で読み取られることはありません。
ビランチ2018年

@Biranchifileは最後の行で使用されていますreader.readAsDataURL(file);
Achim

7

この場合、Deferred Objectを操作して、promiseを返すと便利です。

function readImage(inputElement) {
    var deferred = $.Deferred();

    var files = inputElement.get(0).files;
    if (files && files[0]) {
        var fr= new FileReader();
        fr.onload = function(e) {
            deferred.resolve(e.target.result);
        };
        fr.readAsDataURL( files[0] );
    } else {
        deferred.resolve(undefined);
    }

    return deferred.promise();
}

そして、上記の関数は次のように使用できます。

var inputElement = $("input[name=file]");
readImage(inputElement).done(function(base64Data){
    alert(base64Data);
});

またはあなたの場合:

$(input).on('change',function(){
  readImage($(this)).done(function(base64Data){ alert(base64Data); });
});

私は本当にこれが必要でした。つまり、base64を呼び出しメソッドに戻しているので延期されています。あなたのソリューションがすべてのブラウザで機能するかどうか知りたいですか?
Thameem
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.