5 に答える
残念ながら、それは機能しません。
画像をbyte[]としてHttpServletResponseクラスに書き込むSpringMVCControllerメソッドを使用する必要があります。
例:
@RequestMapping("/getImage/{id}")
public void getImage(HttpServletResponse response,@PathVariable("id") final String id) throws IOException {
response.setContentType("image/jpeg");
byte[] imageBytes = dao.getImage(id);
response.getOutputStream().write(imageBytes);
response.getOutputStream().flush();
}
次に、クライアントでhtmlコードを使用します。
<img src="getImage/222" ... />
更新:@ResposneBody
はい、 Spring3.1以降のアノテーションでそれを行うことができます
登録するByteArrayHttpMessageConverter
<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>
そして、youtコントローラーを使用します。
@RequestMapping("/getPhoto/{id}")
public @ResponseBody byte[] getPhoto(@PathVariable("id") final String id) throws IOException {
byte[] imageBytes = dao.getImage(id);
return imageBytes;
}
秘訣は、データを直接に出力する別のサーブレットをHttpServletResponse.getOutputStream()
用意することです。SuKuが言うように、適切なコンテンツタイプを使用します。<img/>
次に、JSPで、画像サーブレットがタグでマップされているURLをポイントするだけです。たとえば、イメージサーブレットがにマップされている/imgServlet
場合は、次のようなものを使用します
<img src="imgServlet?img=myimage" ... />
ModelAndViewを使用する場合の別のオプションは、メディアタイプを設定し、画像のバイトを出力ストリームに出力するカスタムViewオブジェクトを作成することです。このようにして、ModelAndViewを使用して、リダイレクトを簡単に設定したり、通常のエラーを返したり、画像が見つからないなどのエラーが発生した場合にJSPエラーページを返したりすることができます。
@RequestMapping(value="/imageDisplays/{imageId}")
public void getImage(@PathVariable int imageId,HttpSession session,HttpServletResponse response) {
OutputStream oImage;
try{
byte[] imageInByte = // get image in byte array
response.setContentType("image/jpeg, image/jpg, image/png, image/gif");
oImage=response.getOutputStream();
oImage.write(imageInByte);
oImage.flush();
oImage.close();
}catch(Exception e){
LOGGER.debug("Request could not be completed at this moment. Please try again.");
e.printStackTrace();
}
}
これは私が取り組んでいた質問と似た質問です。ただし、サーブレットの代わりにロングポーリングを使用していました。これがリンクstackoverflowです。