1

xhtml に canvas 要素があります。これを base-64 でエンコードさStringれた dataUrl というtoDataUrl()呼び出しに変換します。これにより、次の出力が生成されますが、わかりやすくするために切り捨てられています。

"data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAAzQAAAImCAYAAACFG89TAAAgAElEQVR4Xu29C7x/5Zj3 [lots of characters...]"

この画像を MySQL データベースに送信したいと考えています。エンティティに Blob (@Lob) フィールドがあり、この文字列をバイト配列に変換するには、dataUrl.getData()このバイト配列を使用してエンティティを更新します。

私の MySQL データベースでは、BLOB が正常に作成されました。ただし、それを右クリックして [エディターでファイルを開く] をクリックすると、[バイト] タブは正常に表示されますが、[画像] タブをクリックすると一般的なエラーが表示され、バイトが何らかの形で破損していることを示唆しています。

これは、このファイルを読みたいときに、バイト配列を引数としてBufferedImage imag = ImageIO.read(is);where isis を使用すると、 null、より具体的にはクラス内のメソッドを返すことを意味します。ByteArrayInputStreamimagreadBufferedImage

編集: スクリーンショットを参照してください。1dataUrl.getBytes()つ目は呼び出し、2 つ目は MySQL の出力です。

ここに画像の説明を入力

ここに画像の説明を入力

4

2 に答える 2

2

の代わりにString.getBytes()、次を使用しました。

BASE64Decoder decoder = new BASE64Decoder();
byte[] b = decoder.decodeBuffer(dataURL.split("^data:image/(png|jpg);base64,")[1]);

そして、それはうまくいきました。

于 2013-08-24T19:19:43.447 に答える
1

わかりました、それdataUrl.getData()はあなたのために働いていないようです。格納しているバイトは基本的に、base64 部分自体に格納されているバイナリデータではなく、"data:image/png;base64,iVBORw0KGg..." の ASCII です。

これをどこかで二重にエンコードしている可能性があります-コードを見ずに判断するのは困難です-しかし、それは私たちが今のところ見ることができるものです.

データベースに格納する前に、バイト配列を確認することをお勧めします。最初の数バイトは、0x89、0x50、0x4e、0x47、0x0d、0x0a、0x1a である必要があります。その部分が機能するようになったら、それでも機能しない場合は、先に進むことができます。

基本的に、プロセスのすべての段階でデータをチェックして、失敗したデコード/二重エンコード/それが何であれを検出できるようにします。

于 2013-08-24T18:16:01.577 に答える