2011-01-29 21 views
33

So che probabilmente è stato chiesto 10000 volte, tuttavia, non riesco a trovare una risposta diretta alla domanda.Converti il ​​byte [] nella stringa Base64 per l'URI dei dati

Ho un LOB memorizzato nel mio db che rappresenta un'immagine; Sto ottenendo quell'immagine dal DB e mi piacerebbe mostrarlo su una pagina web tramite il tag HTML IMG. Questa non è la mia soluzione preferita, ma è un'implementazione stop-gap finché non trovo una soluzione migliore.

Sto cercando di convertire il byte [] per Base64 utilizzando l'Apache Commons Codec nel seguente modo:

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

Poi, sto cercando di mostrare la mia immagine sulla mia pagina come questa:

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

Sta visualizzando l'impostazione predefinita del browser "Non riesco a trovare questa immagine", immagine.

Qualcuno ha qualche idea?

Grazie.

+0

potete inserire il codice completo ... ho bisogno per riferimento. ..io ho anche lo stesso problema ... ma non ho idea di come sarà il codice .. – Lucky

risposta

38

ho usato questo e ha funzionato bene (in contrasto con la risposta accettata, che utilizza un formato non raccomandato per questo scenario):

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

questa è la risposta corretta, senza la codifica UTF8, il browser non ti darà molto fastidio. – phamductri

+1

quali importazioni hai usato? – kozla13

+0

IIRC, la classe Base64 è quella di Apache Commons, anche se non ne sono più sicuro (e non ho più accesso a quel progetto). – WhyNotHugo

12

Secondo la documentazione ufficiale Base64.encodeBase64URLSafeString(byte[] binaryData) dovrebbe essere quello che stai cercando.

Anche il tipo mime per JPG è image/jpeg.

+1

L'esempio [PNG sull'articolo di Wikipedia] (https://secure.wikimedia.org/wikipedia/en/ wiki/Data_URI_scheme # Esempi) suggerisce che l'uso di + e/è ok. –

+1

Qualcuno ha effettivamente provato a usare l'output di Base64.encodeBase64URLSafeString() per vedere se funziona in un browser? encodeBase64URLSafeString() non sembra generare una codifica base64 valida/standard. Per rendere conforme a URI una stringa con codifica Base64, è necessario applicare l'escape del carattere URI standard. Non penso che la funzione sopra sia ciò che vuoi. – Keeth

+0

Questa risposta in realtà non ha generato la stringa corretta per me. La risposta di Hugo contiene la codifica mancante per farlo funzionare. – ryber

2

Si consiglia inoltre di considerare lo streaming delle immagini sul browser anziché codificarle sulla pagina stessa.

Ecco un esempio di streaming di un'immagine contenuta in un file fuori al browser tramite una servlet, che potrebbe essere facilmente adottato per lo streaming dei contenuti del vostro BLOB, piuttosto che un file:

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

Sto usando Spring Web MVC e l'intera pagina viene costruita usando tile, ecc ... Non voglio davvero passare attraverso la PITA di creare un altro controller e chiamare ogni immagine separatamente, ma grazie! –

1

Se non si desidera eseguire lo streaming da un servlet, quindi salvare il file in una directory nel webroot e quindi creare il src che punta a tale posizione. In questo modo il server web fa il lavoro di servire il file. Se ti senti particolarmente intelligente, puoi verificare la presenza di un file esistente mediante timestamp/inode/crc32 e scriverlo solo se è stato modificato nel DB che può darti un incremento delle prestazioni. Questo metodo di file supporta inoltre automaticamente le intestazioni ETag e if-modified-since in modo che il browser possa memorizzare correttamente il file nella cache.

Problemi correlati