दिलचस्प पोस्ट
सीएसएस एक्सेस करें: "बाद में" jQuery के साथ चयनकर्ता मैं जेवीएम द्वारा उपयोग किए जाने वाले प्रॉक्सी कैसे सेट करूं? Ng- शामिल करते समय गुंजाइश खोना JQuery का उपयोग करके एक ड्रॉप-डाउन सूची (चयन करें बॉक्स) से चयनित पाठ प्राप्त करें मैं 2 विभिन्न y- अक्षों के साथ कैसे साजिश कर सकता हूं? रनटाइम पर सामान्य प्रकार का वर्ग प्राप्त करें आयनिक 2 – एप के लिए वैश्विक नवबर जावा एसएसएल और प्रमाणपत्र कीस्टस्टोर जावास्क्रिप्ट में डॉलर मुद्रा स्ट्रिंग के रूप में मैं संख्याओं को कैसे प्रारूपित कर सकता हूं? जावास्क्रिप्ट में एक वर्ग को परिभाषित करने के लिए कौन सी तकनीकों का उपयोग किया जा सकता है, और उनके व्यापार-नापसंद क्या हैं? मैं एक एमवीसी नियंत्रक से डाउनलोड करने के लिए एक फाइल कैसे पेश करूं? उद्देश्य-सी में शून्य बनाम शून्य बड़े परिणाम सेट MySQL के साथ स्ट्रीमिंग हाइबरनेट में विभिन्न बचत तरीकों के बीच अंतर क्या हैं? jQuery के फायदे / अंतर। स्ट्रिंग () बनाम। क्लिक करें ()

स्प्रिंग एमवीसी: रिसेप्शनबॉडी में छवि कैसे लौटाएगी?

मुझे डीबी से छवि डेटा ( byte[] रूप में मिल रहा है @ResponseBody में इस छवि को कैसे वापस @ResponseBody ?

संपादित करें

मैं @ResponseBody बिना किया था HttpServletResponse विधि पैरामीटर के रूप में उपयोग:

 @RequestMapping("/photo1") public void photo(HttpServletResponse response) throws IOException { response.setContentType("image/jpeg"); InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg"); IOUtils.copy(in, response.getOutputStream()); } 

पंजीकृत @ResponseBody साथ @ResponseBody का उपयोग करना। @ResponseBody कनवर्टर के रूप में @ सिड ने मेरे लिए काम नहीं किया 🙁

 @ResponseBody @RequestMapping("/photo2") public byte[] testphoto() throws IOException { InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg"); return IOUtils.toByteArray(in); } 

वेब के समाधान से एकत्रित समाधान "स्प्रिंग एमवीसी: रिसेप्शनबॉडी में छवि कैसे लौटाएगी?"

यदि आप 3.1 या नए के स्प्रिंग संस्करण का उपयोग कर रहे हैं तो आप @RequestMapping एनोटेशन में "उत्पादन" निर्दिष्ट कर सकते हैं। नीचे दिए गए उदाहरण बॉक्स के बाहर मेरे लिए काम करता है रजिस्टर कनवर्टर या किसी अन्य चीज की ज़रूरत नहीं है अगर आपके पास वेब एमवीसी सक्षम है ( @EnableWebMvc )

 @ResponseBody @RequestMapping(value = "/photo2", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE) public byte[] testphoto() throws IOException { InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg"); return IOUtils.toByteArray(in); } 

स्प्रिंग 4.1 और उससे ऊपर के साथ, आप किसी भी अतिरिक्त निर्भरता के बिना काफी कुछ (जैसे कि चित्र, पीडीएफ, दस्तावेजों, जार, ज़िप, आदि) काफी कुछ वापस कर सकते हैं। उदाहरण के लिए, मॉंगोडीबी ग्रैडएफएस से उपयोगकर्ता की प्रोफाइल तस्वीर को वापस करने का एक तरीका हो सकता है:

 @RequestMapping(value = "user/avatar/{userId}", method = RequestMethod.GET) @ResponseBody public ResponseEntity<InputStreamResource> downloadUserAvatarImage(@PathVariable Long userId) { GridFSDBFile gridFsFile = fileService.findUserAccountAvatarById(userId); return ResponseEntity.ok() .contentLength(gridFsFile.getLength()) .contentType(MediaType.parseMediaType(gridFsFile.getContentType())) .body(new InputStreamResource(gridFsFile.getInputStream())); } 

नोट करने वाली चीजें:

  • InputStreamResource के साथ एक वापसी प्रकार के रूप में प्रतिक्रियाएं

  • ResponseEntity Builder शैली निर्माण

इस पद्धति के साथ आपको एचटीटीपीएसर्वेट रिपस्पेंस में ऑटोवॉयरिंग के बारे में चिंता करने की ज़रूरत नहीं है, IOException फेंकना या स्ट्रीम डेटा को कॉपी करना है।

@ResponseBody पंजीकरण के अलावा, आप @ResponseBody बदले ResponseEntity का उपयोग करना चाह सकते हैं। निम्नलिखित कोड मेरे लिए काम करता है:

 @RequestMapping("/photo2") public ResponseEntity<byte[]> testphoto() throws IOException { InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg"); final HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.IMAGE_PNG); return new ResponseEntity<byte[]>(IOUtils.toByteArray(in), headers, HttpStatus.CREATED); } 

स्प्रिंग 3.1.x और 3.2.x का प्रयोग करके, आपको ऐसा करना चाहिए:

नियंत्रक विधि:

 @RequestMapping("/photo2") public @ResponseBody byte[] testphoto() throws IOException { InputStream in = servletContext.getResourceAsStream("/images/no_image.jpg"); return IOUtils.toByteArray(in); } 

और servlet-context.xml फ़ाइल में एमवीसी एनोटेशन:

 <mvc:annotation-driven> <mvc:message-converters> <bean class="org.springframework.http.converter.ByteArrayHttpMessageConverter"> <property name="supportedMediaTypes"> <list> <value>image/jpeg</value> <value>image/png</value> </list> </property> </bean> </mvc:message-converters> </mvc:annotation-driven> 

कुछ उत्तर के अलावा यहां कुछ संकेत दिए गए हैं (स्प्रिंग 4.1)।

यदि आपके पास कोई भी संदेश नहीं है, जो आपके WebMvcConfig में कॉन्फ़िगर किया गया है, तो आपके @ResponseBody के भीतर ResponseEntity अच्छी तरह से काम करता है।

यदि आप करते हैं, तो आपके पास एक MappingJackson2HttpMessageConverter कॉन्फ़िगर किया गया है (जैसे मेरे) ResponseEntity का उपयोग कर एक MappingJackson2HttpMessageConverter देता है।

इस मामले में केवल काम करने का उपाय @ResponseBody में एक byte[] लपेट करना है:

 @RequestMapping(value = "/get/image/{id}", method=RequestMethod.GET, produces = MediaType.IMAGE_PNG_VALUE) public @ResponseBody byte[] showImageOnId(@PathVariable("id") String id) { byte[] b = whatEverMethodUsedToObtainBytes(id); return b; } 

इस मामले में अपने WebMvcConfig में संदेश कन्वर्टर्स को ठीक तरह से कॉन्फ़िगर करने के लिए याद रखें (और एक बाइटअरेरेक्टएमएमसीएजेस कॉन्वेरियर जोड़ें), ऐसा करें:

 @Override public void configureMessageConverters(List<HttpMessageConverter<?>> converters) { converters.add(mappingJackson2HttpMessageConverter()); converters.add(byteArrayHttpMessageConverter()); } @Bean public MappingJackson2HttpMessageConverter mappingJackson2HttpMessageConverter() { ObjectMapper objectMapper = new ObjectMapper(); objectMapper.disable(SerializationFeature.WRITE_DATES_AS_TIMESTAMPS); objectMapper.setSerializationInclusion(JsonInclude.Include.NON_NULL); MappingJackson2HttpMessageConverter converter = new MappingJackson2HttpMessageConverter(); converter.setObjectMapper(objectMapper); return converter; } @Bean public ByteArrayHttpMessageConverter byteArrayHttpMessageConverter() { ByteArrayHttpMessageConverter arrayHttpMessageConverter = new ByteArrayHttpMessageConverter(); arrayHttpMessageConverter.setSupportedMediaTypes(getSupportedMediaTypes()); return arrayHttpMessageConverter; } private List<MediaType> getSupportedMediaTypes() { List<MediaType> list = new ArrayList<MediaType>(); list.add(MediaType.IMAGE_JPEG); list.add(MediaType.IMAGE_PNG); list.add(MediaType.APPLICATION_OCTET_STREAM); return list; } 

आपके एप्लिकेशन संदर्भ में एक एनाटेशन मैथहाडलर एडेप्टर घोषित करें और रजिस्टर बैटअरेरे एचटीटीपी मेसेज कनॉन्टर:

 <bean class="org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter"> <property name="messageConverters"> <util:list> <bean id="byteArrayMessageConverter" class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/> </util:list> </property> </bean> 

हेन्डलर पद्धति में भी आपकी प्रतिक्रिया के लिए उपयुक्त सामग्री प्रकार सेट करें।

  @RequestMapping(value = "/get-image",method = RequestMethod.GET) public ResponseEntity<byte[]> getImage() throws IOException { RandomAccessFile f = new RandomAccessFile("/home/vivex/apache-tomcat-7.0.59/tmpFiles/1.jpg", "r"); byte[] b = new byte[(int)f.length()]; f.readFully(b); final HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.IMAGE_PNG); return new ResponseEntity<byte[]>(b, headers, HttpStatus.CREATED); } 

मेरे लिए काम किया

मैं यह एक prefere:

 private ResourceLoader resourceLoader = new DefaultResourceLoader(); @ResponseBody @RequestMapping(value = "/{id}", produces = "image/bmp") public Resource texture(@PathVariable("id") String id) { return resourceLoader.getResource("classpath:images/" + id + ".bmp"); } 

मीडिया प्रकार को बदलें जो आपके पास कभी भी छवि प्रारूप हो।

स्प्रिंग 4 में यह मेरे लिए काम है

 @RequestMapping(value = "/image/{id}", method = RequestMethod.GET) public void findImage(@PathVariable("id") String id, HttpServletResponse resp){ final Foto anafoto = <find object> resp.reset(); resp.setContentType(MediaType.IMAGE_JPEG_VALUE); resp.setContentLength(anafoto.getImage().length); final BufferedInputStream in = new BufferedInputStream(new ByteArrayInputStream(anafoto.getImageInBytes())); try { FileCopyUtils.copy(in, resp.getOutputStream()); resp.flushBuffer(); } catch (final IOException e) { // TODO Auto-generated catch block e.printStackTrace(); } } 

उत्तर में से कोई भी मेरे लिए काम नहीं करता, इसलिए मैंने इसे ऐसा करने में कामयाब रहा है:

 HttpHeaders headers = new HttpHeaders(); headers.setContentType(MediaType.parseMediaType("your content type here")); headers.set("Content-Disposition", "attachment; filename=fileName.jpg"); headers.setContentLength(fileContent.length); return new ResponseEntity<>(fileContent, headers, HttpStatus.OK); 

Content-Disposition हेडर सेट करना मैं अपने विधि पर @ResponseBody एनोटेशन के साथ फाइल को डाउनलोड करने में सक्षम था।

यह मैं स्प्रिंग बूट और पेवावा के साथ कैसे करूँ:

 @RequestMapping(value = "/getimage", method = RequestMethod.GET, produces = MediaType.IMAGE_JPEG_VALUE) public void getImage( HttpServletResponse response ) throws IOException { ByteStreams.copy( getClass().getResourceAsStream( "/preview-image.jpg" ), response.getOutputStream() ); } 

वसंत 4 में यह बहुत आसान है कि आप सेम में कोई भी बदलाव करने की आवश्यकता नहीं है। केवल अपनी वापसी प्रकार @ RESPonseBody को चिह्नित करें

उदाहरण:-

 @RequestMapping(value = "/image/{id}") public @ResponseBody byte[] showImage(@PathVariable Integer id) { byte[] b; /* Do your logic and return */ return b; }