26

HTML5を使用すると、データをローカルに保存できます。これはすばらしいことだと思います。たとえば、次のように使用できます。

        var store = window.localStorage;
        store.setItem('foo', "hellow world");
        var test = store.getItem('foo');
        // test should = "hellow world"

HTMLでは、ソースを次のように設定することで、画像を動的に表示できます。

     "data:image/jpg;base64," + (base64string)

だから私の質問は、html5ローカルストレージを利用できるように、バイナリデータをbase64文字列に変換するにはどうすればよいですか?

たとえば、私ができればそれは素晴らしいでしょう:

$.ajax({
   url: 'someImage.png',
   type: 'POST',
   success: function (r) {

                // here I want to convert r to a base64 string !
                // r is not binary so maybe I have to use a different approach
                var data = ConvertToBase64(r);



                document.getElementById("img").src = "data:image/png;base64," + data;
            },
});

html5を使用して画像をキャンバスにラップし、それをbase64stringに変換することで、この問題を解決できることはわかっています。また、その画像のbase64文字列データ(someImage.aspx)を送信する特定のサービスをサーバー上で作成することもできます。サーバーからバイナリデータを取得してbase64文字列に変換できるかどうかを知りたいだけです。

4

6 に答える 6

20

'InvalidCharacterError'エラーを防ぐには、次のようにする必要があります。

var base64EncodedStr = btoa(unescape(encodeURIComponent(rawData)));
于 2017-01-03T13:51:45.090 に答える
11

FileReaderを使用して、画像をデータURLとしてエンコードします。

jQuery.ajax({...})
.done(function (r) {
  var reader = new FileReader(
  reader.onload = (function(self) {
    return function(e) {
      document.getElementById("img").src = e.target.result;
    }
  })(this);
  reader.readAsDataURL(new Blob([r]));
});
于 2015-03-12T10:05:34.390 に答える
6

関数を試してくださいbtoa

   var data = btoa(r);
于 2012-06-11T15:04:48.957 に答える
5

これは古い質問ですが、より良い答えが見つからなかったので、この関数を書き留めました。Uint8Arrayをbase64より前の文字列に変換せずに、直接Base64に変換します。それが誰かを助けることを願っています。

var encoder = new TextEncoder("ascii");
var decoder = new TextDecoder("ascii");
var base64Table = encoder.encode('ABCDEFGHIJKLMNOPQRSTUVWXYZabcdefghijklmnopqrstuvwxyz0123456789+/=');
function toBase64(dataArr){
    var padding = dataArr.byteLength % 3;
    var len = dataArr.byteLength - padding;
    padding = padding > 0 ? (3 - padding) : 0;
    var outputLen = ((len/3) * 4) + (padding > 0 ? 4 : 0);
    var output = new Uint8Array(outputLen);
    var outputCtr = 0;
    for(var i=0; i<len; i+=3){              
        var buffer = ((dataArr[i] & 0xFF) << 16) | ((dataArr[i+1] & 0xFF) << 8) | (dataArr[i+2] & 0xFF);
        output[outputCtr++] = base64Table[buffer >> 18];
        output[outputCtr++] = base64Table[(buffer >> 12) & 0x3F];
        output[outputCtr++] = base64Table[(buffer >> 6) & 0x3F];
        output[outputCtr++] = base64Table[buffer & 0x3F];
    }
    if (padding == 1) {
        var buffer = ((dataArr[len] & 0xFF) << 8) | (dataArr[len+1] & 0xFF);
        output[outputCtr++] = base64Table[buffer >> 10];
        output[outputCtr++] = base64Table[(buffer >> 4) & 0x3F];
        output[outputCtr++] = base64Table[(buffer << 2) & 0x3F];
        output[outputCtr++] = base64Table[64];
    } else if (padding == 2) {
        var buffer = dataArr[len] & 0xFF;
        output[outputCtr++] = base64Table[buffer >> 2];
        output[outputCtr++] = base64Table[(buffer << 4) & 0x3F];
        output[outputCtr++] = base64Table[64];
        output[outputCtr++] = base64Table[64];
    }
    
    var ret = decoder.decode(output);
    output = null;
    dataArr = null;
    return ret;
}
于 2020-08-21T16:40:58.170 に答える
2
//dataArr is a Uint8Array        
function toBase64(dataArr){
            return btoa(dataArr.reduce((data, val)=> {
                 return data + String.fromCharCode(val);
            }, ''));
        }
于 2021-05-06T20:43:41.937 に答える
0

現代のブラウザのための公正でシンプルなソリューション

fetch('https://picsum.photos/536/354', {
    method: 'GET',
})
.then((data) => {
    // IMP to convert your json or other response to blob ( for this you have to check your api response is file / binary 
    return data.blob()
})
.then((data) => {
    var reader = new FileReader();
    reader.onload = function() {                         
        var b64 = reader.result
        console.log("This is base64", b64)
        document.getElementById("imagetoShow").src = b64
    }
    reader.readAsDataURL(data)
})
.catch((error) => {
    error.text().then( errorMessage => {
        console.log(errorMessage)
    })
})
<image src="" width="200" height="200" id="imagetoShow"/>

于 2021-06-29T03:13:44.663 に答える