मैं मोंगोडब डेटाबेस से छवि को सहेजने और दिखाने की कोशिश कर रहा हूं। मैं इसे बेस -64 स्ट्रिंग में स्वरूपित डेटाबेस में सहेजता हूं। उदाहरण के लिए यह उन छवियों में से एक है:

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

यह खोज छवि सेवा है जो छवि के स्ट्रिंग प्रारूप को बाइट्स की एक सरणी में बदल देती है:

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

और यह नियंत्रक वर्ग में खोज छवि है:

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

मैं अपनी स्क्रिप्ट फ़ाइल में चित्र दिखाने के लिए एक url बनाता हूँ:

<script>
        function makeURL(val, row) {

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

लेकिन इस तरह एक यूआरएल कॉल करते समय:

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

यह त्रुटि देता है: छवि प्रदर्शित नहीं की जा सकती क्योंकि इसमें त्रुटियां हैं।

नोट: मुझे लगता है कि सर्विस फाइंड इमेज फंक्शन में कोई समस्या है जहां यह बेस -64 स्ट्रिंग को बाइट [] की एक सरणी में बदल देता है, लेकिन मुझे नहीं पता कि इसे सही प्रारूप में कैसे बदला जाए।

0
ShakibaZar 10 मई 2017, 14:37

2 जवाब

सबसे बढ़िया उत्तर

आप स्ट्रिंग पर केवल getBytes() को कॉल कर रहे हैं, लेकिन दो बिंदु हैं जिन पर आपको ध्यान देना चाहिए।

  1. HTML पेज के अंदर इमेज डेटा को इनलाइन करने के लिए स्ट्रिंग में एक विशेष सिंटैक्स होता है। पहले भाग में MIME प्रकार और ;base64 है जो दर्शाता है कि अल्पविराम के बाद का अगला भाग बेस 64 एन्कोडेड है।

  2. getBytes() आपको स्ट्रिंग का बाइट प्रतिनिधित्व इस प्रकार देता है। यह वह नहीं है जो आप चाहते हैं। चूंकि बेस 64 एक विशेष एन्कोडिंग है, इसलिए आपको इसे विशेष रूप से व्यवहार करना होगा। आप मानक वर्ग 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
vanje 10 मई 2017, 16:29

इन्हें अपने नियंत्रक में उपयोग करने का प्रयास करें:

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);
    }
}
0
S Jayesh 10 मई 2017, 16:49