2011-01-29 4 views
33

これはおそらく10000回尋ねられたことは知っていますが、私は質問に直接答えを見つけることはできません。byte []をデータ用のBase64文字列に変換する

イメージを表すデータベースにLOBが格納されています。私はDBからそのイメージを取得しています。私はHTML IMGタグでWebページに表示したいと思います。これは私の好みの解決策ではありませんが、より良い解決策が見つかるまではストップギャップの実装です。

私は次のようにApacheのコモンズのコーデックを使用してBase64でに[]バイトを変換しようとしている:

String base64String = Base64.encodeBase64String({my byte[]}); 

その後、私はこのような私のページに私の画像を表示しようとしています:

<img src="data:image/jpg;base64,{base64String from above}"/> 

ブラウザのデフォルトの「この画像が見つかりません」という画像が表示されています。

誰にもアイデアはありますか?

ありがとうございました。

+0

あなたは完全なコードを投稿することができます...私は、参考のためにそれを必要とします。 ..iも同じ問題を抱えています...しかし、私はコードがどのようになるかについては考えていません.. – Lucky

答えて

38

(このシナリオにはお勧めしません形式を使用しています受け入れ答え、に反して)私はこれを使用し、それがうまく働いた:

StringBuilder sb = new StringBuilder(); 
sb.append("data:image/png;base64,"); 
sb.append(StringUtils.newStringUtf8(Base64.encodeBase64(imageByteArray, false))); 
contourChart = sb.toString(); 
+2

これは正解ですが、UTF8エンコーディングがなければ、ブラウザはあなたにすべての頭痛を与えません。 – phamductri

+1

あなたはどの輸入品を使用しましたか? – kozla13

+0

IIRCでは、Base64クラスはApacheのコモンズからのものですが、私はもはや(もはやそのプロジェクトにアクセスすることはできません。 – WhyNotHugo

12

公式文書Base64.encodeBase64URLSafeString(byte[] binaryData)によると、あなたが探しているものになるはずです。

また、JPGのMIMEタイプはimage/jpegです。

+1

[Wikipediaの記事のPNGの例](https://secure.wikimedia.org/wikipedia/en/ wiki/Data_URI_scheme#Examples)は、+と/は大丈夫だと示唆しています。 –

+1

誰かが実際にBase64.encodeBase64URLSafeString()の出力を使ってブラウザで動作するかどうか試してみましたか? encodeBase64URLSafeString()は有効な/標準のbase64エンコーディングを生成していません。 URIに準拠したbase64エンコード文字列を作成するには、標準のURI文字エスケープを適用する必要があります。私は上記の機能があなたが望むものだとは思わない。 – Keeth

+0

この答えは実際に私のために適切な文字列を生成しませんでした。 Hugoの答えには、機能していないエンコーディングが含まれています。 – ryber

2

また、ページ自体でエンコードするのではなく、イメージをブラウザに流すことを検討することもできます。

public void doGet(HttpServletRequest req, HttpServletResponse resp) 
    throws ServletException, IOException 
    { 
    ServletOutputStream sos = resp.getOutputStream(); 
    try { 
     final String someImageName = req.getParameter(someKey); 

     // encode the image path and write the resulting path to the response 
     File imgFile = new File(someImageName); 

     writeResponse(resp, sos, imgFile); 
    } 
    catch (URISyntaxException e) { 
     throw new ServletException(e); 
    } 
    finally { 
     sos.close(); 
    } 
    } 

    private void writeResponse(HttpServletResponse resp, OutputStream out, File file) 
    throws URISyntaxException, FileNotFoundException, IOException 
    { 
    // Get the MIME type of the file 
    String mimeType = getServletContext().getMimeType(file.getAbsolutePath()); 
    if (mimeType == null) { 
     log.warn("Could not get MIME type of file: " + file.getAbsolutePath()); 
     resp.setStatus(HttpServletResponse.SC_INTERNAL_SERVER_ERROR); 
     return; 
    } 

    resp.setContentType(mimeType); 
    resp.setContentLength((int)file.length()); 

    writeToFile(out, file); 
    } 

    private void writeToFile(OutputStream out, File file) 
    throws FileNotFoundException, IOException 
    { 
    final int BUF_SIZE = 8192; 

    // write the contents of the file to the output stream 
    FileInputStream in = new FileInputStream(file); 
    try { 
     byte[] buf = new byte[BUF_SIZE]; 
     for (int count = 0; (count = in.read(buf)) >= 0;) { 
     out.write(buf, 0, count); 
     } 
    } 
    finally { 
     in.close(); 
    } 
    } 
+0

私はSpring Web MVCを使用しており、ページ全体がタイルなどを使って構築されています...私は実際に別のコントローラを作成し、それぞれの画像を別々に呼び出すというPITAを望んでいません。 –

1

あなたの場合:ここで

は簡単にBLOBの内容をストリーミングするために採用することができ、サーブレット、のではなく、ファイルを経由してブラウザに出たファイルに含まれる画像のストリーミングの例ですサーブレットからストリーミングしたくない場合は、Webルートのディレクトリにファイルを保存し、その場所を指すsrcを作成します。そうすれば、Webサーバーはファイルを提供する作業を行います。特に賢明な気がしているなら、timestamp/inode/crc32で既存のファイルをチェックし、DB内で変更されている場合にのみパフォーマンスを向上させることができます。このファイルメソッドは、ブラウザがファイルを適切にキャッシュできるように、ETagおよびif-modified-sinceヘッダーも自動的にサポートします。

関連する問題