2017-05-10 76 views
0

我試圖保存並顯示來自mongodb數據庫的圖像。我將它保存在以base-64字符串格式化的數據庫中。 例如這是那些圖像中的一個:無法顯示圖像,因爲它包含錯誤jsp

"data:image/jpeg;base64,/9j/4AAQSkZJRgABAgEAYABgAAD/7gAOQWRvYmUAZAAAAAAB/+EN/kV4aWYAAE1NACoAAAAIAAgBMgACAAAAFAAAAG4BOwACAAAACwAAAIJHRgADAAAAAQAFAABHSQADA...... 

這是其改變圖像的字符串格式的字節數組findImage服務:

public byte[] findImage(String id) 
    { 
     String str = chRepository.findImage(id); 
     byte[] b = str.getBytes(); 
     return b; 
    } 

,這是findImage在控制器類:

@GetMapping("/findImage/{id}") 
    public byte[] findImage(@PathVariable String id) throws IOException 
    { 
     byte[] bb = IOUtils.toByteArray(new ByteArrayInputStream(chService.findImage(id))); 
     return bb; 
    } 

我在地址欄中顯示圖片:

<script> 
     function makeURL(val, row) { 

      if (val){ 
       return '<a target="_blank" href= "' +window.location.href+ 'ch/findImage/' + val + '">image</a>'; 
      } 
     } 
    </script> 

但調用這樣一個URL時:

http://localhost:8080/ch/findImage/5 

它給人的錯誤:無法顯示圖像,因爲它包含錯誤。

注意:我猜服務findImage函數存在一個問題,它將base-64字符串更改爲byte []數組,但我不知道如何將其更改爲正確的格式。

+0

向我們展示了整個JSP標籤 –

+0

說你的形象將成爲'png'形象,那麼要麼做etContentType(「img/png」);'或做一些像'response.setHeader(「content-type」,「img/png」);'。 –

+0

這只是一個按鈕,其onclick功能設置在makeURL @BasilBattikhi – user5621266

回答

0

你只打電話給getBytes(),但有兩點你必須考慮。

  1. 字符串有inlineing一個HTML頁面內的圖像數據的特殊語法。第一部分包含MIME類型和;base64,表示逗號後面的部分是Base64編碼。

  2. getBytes()爲您提供字符串的字節表示。這不是你想要的。因爲Base64是一種特殊的編碼,所以你必須特別對待它。你可以使用標準的類java.util.Base64

例子:

/** 
* Decodes the Base64 part to bytes. 
* 
* @param img An inline data encoded in Base64 like <code>"data:image/jpeg;base64,/9j/4AAQSkZJRg..."</code>. 
* 
* @return Decoded data part 
*/ 
public static byte[] parseImageString(String img) { 
    // Avoid a NPE 
    if(img == null) { 
    return null; 
    } 

    // Use only the part after the comma 
    final int pos = img.indexOf(','); 
    if(pos >= 0) { 
    final String base64Part = img.substring(pos + 1); 
    final Base64.Decoder base64Decoder = Base64.getDecoder(); 
    return base64Decoder.decode(base64Part); 
    } else { 
    return null; 
    } 
} 
+0

是不是低安全性的東西,如果我們發送字節數組而不是base64字符串? – user5621266

+1

Base64不會提高安全級別。這不是加密。它只是同一個字節塊的替代表示。如果您希望只有專用用戶才能查看此映像,則應使用HTTPS和具有會話的登錄機制。然後在處理圖像請求的servlet中,您可以爲不允許用戶查看此圖像的用戶發送錯誤。 – vanje

+0

如果它不提高安全性,我們爲什麼要使用它? – user5621266

0

嘗試在你的控制器使用這些:

public void findImage(@PathVariable String id, 
         HttpServletResponse response) throws IOException 
{ 
    BufferedImage myIMG = ImageIO.read(<inputStreamHere>) 
    //you'll have to create inputstream for ur image 
    ServletOutputStream out = response.getOutputStream(); 
    response.setContentType("image/jpeg"); 
    ImageIO.write(bufferedImage, "jpeg", out); 
    out.close(); 
} 

或者,你可以這樣做:

@GetMapping("/findImage/{id}") 
public byte[] findImage(@PathVariable String id, 
          HttpServletResponse response) throws IOException 
{ 
    ServletOutputStream out = response.getOutputStream(); 
    ByteArrayOutputStream os = new ByteArrayOutputStream(); 
    try { 
     byte[] b; 
     ImageIO.write(<bufferedImageHere>, "png", Base64.getEncoder().wrap(os)); 
     StringBuilder sb = new StringBuilder(); 
     sb.append("data:image/png;base64,").append(os); 
     b = String.valueOf(sb).getBytes(); 
     out.write(b); 
    } catch (IOException ioe) { 
     throw new Exception(ioe); 
    } 
} 
相關問題