blobをbase64に変換する


140

これは私BlobBase64文字列にしたいコードのスニペットです:

このコメント部分は機能し、これによって生成されたURLがimg srcに設定されると、画像が表示されます。

var blob = items[i].getAsFile();
//var URLObj = window.URL || window.webkitURL;
//var source = URLObj.createObjectURL(blob);
//console.log("image source=" + source);

var reader = new FileReader();
reader.onload = function(event){
console.log(event.target.result)
}; // data url!
var source = reader.readAsBinaryString(blob);

問題は下位コードにあり、生成されたソース変数はnullです

更新:

上記のコードのように、JQueryを使用してBlobファイルからBase64文字列を作成できる簡単な方法はありますか?

回答:


273
 var reader = new FileReader();
 reader.readAsDataURL(blob); 
 reader.onloadend = function() {
     var base64data = reader.result;                
     console.log(base64data);
 }

ドキュメント readAsDataURLをbase64にエンコードする形式


1
出力文字列がbase64のように見えませんか?
クォーク

1
@xybrek read.resultを出力すると、文字列自体にbase64が表示されます。
Nawaf Alsulami 2014

27
console.log(base64data.substr(base64data.indexOf( '、')+ 1));
パロタ

9
onloadendreadAsDataURL何か奇妙なことが起こり、次のコード行に到達する前にロードが完了する場合に備えて、前に来る必要があります。明らかにこれは決して起こらないでしょうが、それでも良い習慣です。
2015

2
この答えは不正解です。文字列の前にbase64以外の文字が追加されます。
Joshua Smith

28

これは私のために働きました:

var blobToBase64 = function(blob, callback) {
    var reader = new FileReader();
    reader.onload = function() {
        var dataUrl = reader.result;
        var base64 = dataUrl.split(',')[1];
        callback(base64);
    };
    reader.readAsDataURL(blob);
};

引数は何cbですか?
仲間の見知らぬ人

1
@FellowStrangerは一般にコールバックで、blobToBase64(myBlob、function(base64String){/ * use base64String * /})のように使用されます。非同期だからです
Leonard Pauli

@yeahdixon、私はあなたの助けを必要とするようです。これを見てください。stackoverflow.com
Success Man

7
var audioURL = window.URL.createObjectURL(blob);
audio.src = audioURL;

var reader = new window.FileReader();
reader.readAsDataURL(blob);
reader.onloadend = function () {
     base64data = reader.result;
     console.log(base64data);
}

FileReaderがbase64として結果属性に公開されるため、@ Vemonusは完璧に機能します。
カミロドリゲス

6

スタックに依存しない純粋なJavaSriptの方法があります。

const blobToBase64 = blob => {
  const reader = new FileReader();
  reader.readAsDataURL(blob);
  return new Promise(resolve => {
    reader.onloadend = () => {
      resolve(reader.result);
    };
  });
};

このヘルパー関数を使用するには、コールバックを設定する必要があります。例:

blobToBase64(blobData).then(res => {
  // do what you wanna do
  console.log(res); // res is base64 now
});

私はReact Nativeプロジェクトでの問題のためにこのヘルパー関数を作成しました。イメージをダウンロードして、それをキャッシュされたイメージとして保存したいと思いました。

fetch(imageAddressAsStringValue)
  .then(res => res.blob())
  .then(blobToBase64)
  .then(finalResult => { 
    storeOnMyLocalDatabase(finalResult);
  });

5
function bufferToBinaryString(arrayBuffer){
    return String.fromCharCode(...new Uint8Array(arrayBuffer));
}
(async () => console.log(btoa(bufferToBinaryString(await new Response(blob).arrayBuffer()))))();

または

function bufferToBinaryString(arrayBuffer){
    return String.fromCharCode(...new Uint8Array(arrayBuffer));
}
new Response(blob).arrayBuffer().then(arr_buf => console.log(btoa(bufferToBinaryString(arr_buf)))))

参照応答のコンストラクタを、あなたが変えることができます[blob, buffer source form data, readable stream, etc.]の対応、その後に変換することができ、[json, text, array buffer, blob]非同期メソッド/コールバックで。

編集:@Ralphが言及したように、すべてをutf-8文字列に変換すると問題が発生します(残念ながらResponse APIはバイナリ文字列に変換する方法を提供しません)。代わりに配列バッファーが中間として使用され、さらに2つのステップが必要です(変換するバイト配列THENからバイナリ文字列へ)、ネイティブの使用を主張する場合btoaメソッドの。


.text()はUTF8を使用してデコードします。応答にバイナリコードがある場合はどうなりますか?これはテキスト以外のデータでは失敗すると思います
Ralph

私はあなたの要点を理解し、答えを修正しました(かなり長くなります)この時点では、主張しない方がいいでしょうbtoa
バレン

4

次の方法で問題を修正できます。

var canvas = $('#canvas'); 
var b64Text = canvas.toDataURL();
b64Text = b64Text.replace('data:image/png;base64,','');
var base64Data = b64Text;

これがお役に立てば幸いです


4

したがって、問題は、base 64画像をアップロードする必要があり、blob URLがあることです。すべてのhtml 5ブラウザーで機能する答えは次のとおりです。

  var fileInput = document.getElementById('myFileInputTag');
  var preview = document.getElementById('myImgTag');

  fileInput.addEventListener('change', function (e) {
      var url = URL.createObjectURL(e.target.files[0]);
      preview.setAttribute('src', url);
  });
function Upload()
{
     // preview can be image object or image element
     var myCanvas = document.getElementById('MyCanvas');
     var ctx = myCanvas.getContext('2d');
     ctx.drawImage(preview, 0,0);
     var base64Str = myCanvas.toDataURL();
     $.ajax({
         url: '/PathToServer',
         method: 'POST',
         data: {
             imageString: base64Str
         },
     success: function(data) { if(data && data.Success) {}},
     error: function(a,b,c){alert(c);}
     });
 }

0

リストに保存するためにbase64値にアクセスでき、イベントリスナーの追加が機能するようなものが欲しかった。画像ブロブを読み取り、結果にbase64を返すFileReaderが必要です。

createImageFromBlob(image: Blob) {
    const reader = new FileReader();
    const supportedImages = []; // you can also refer to some global variable
    reader.addEventListener(
      'load',
      () => {
        // reader.result will have the required base64 image
        const base64data = reader.result;
        supportedImages.push(base64data); // this can be a reference to global variable and store the value into that global list so as to use it in the other part
      },
      false
    );
    // The readAsDataURL method is used to read the contents of the specified Blob or File.
    if (image) {
      reader.readAsDataURL(image);
    }
 }

最後の部分は、指定されたBlobのコンテンツを読み取るために使用されている非常に重要なreadAsDataURLです。


-2

1行のコードで最も簡単な方法

var base64Image = new Buffer(blob、 'binary').toString( 'base64');


18
この回答はNode APIを使用しているため、Blob(ブラウザAPI)に関する元の質問には回答しません。
RReverser

バッファとは?
IntoTheDeep

1
Uncaught TypeErrorが発生します。最初の引数は、文字列、Buffer、ArrayBuffer、Array、または配列のようなオブジェクトでなければなりません。
間違っ

@TeodorKolevこれはNode.jsに固有です
Jader Dias
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.