通过URL读取图像并在JSP页面上呈现图像的最佳方法是什么?
到目前为止,我编写了两个JSP页面。
编辑开始:
*Experimental: Obviously the ImageServ will be a servlet, not a jsp.
编辑结束:
index.jsp
<%page ....
<html>
......
<img src="ImageServ.jsp?url=http://serveripaddress/folder/image.jpg" />
.....
ImageServ.jsp
<%@page import="javax.imageio.ImageIO"%>
<%@page import="java.net.URL"%>
<%@page import="java.io.*, java.awt.*, java.awt.image.*,com.sun.image.codec.jpeg.*" %>
<%
try {
String urlStr = "";
if(request.getParameter("url") != null)
{
urlStr = request.getParameter("url");
URL url = new URL(urlStr);
BufferedImage img = null;
try{
img = ImageIO.read(url);
out.println(" READ SUCCESS" + "<br>");
}catch(Exception e) {
out.println("READ ERROR " + "<br>");
e.printStackTrace(new PrintWriter(out));
}
try {
response.setContentType("image/jpeg");
JPEGImageEncoder encoder = JPEGCodec.createJPEGEncoder(response.getOutputStream());
encoder.encode(img);
}catch(Exception ee) {
response.setContentType("text/html");
out.println("ENCODING ERROR " + "<br>");
ee.printStackTrace(new PrintWriter(out));
}
}
} catch (Exception e) {
e.printStackTrace(new PrintWriter(out));
}
%>
但这似乎不起作用: 我一直看到这个错误:
READ SUCCESS
ENCODING ERROR
java.io.IOException: reading encoded JPEG Stream
at sun.awt.image.codec.JPEGImageEncoderImpl.writeJPEGStream(Native Method)
at sun.awt.image.codec.JPEGImageEncoderImpl.encode(JPEGImageEncoderImpl.java:476)
at sun.awt.image.codec.JPEGImageEncoderImpl.encode(JPEGImageEncoderImpl.java:228)
关于如何使这个工作的任何想法???
答案 0 :(得分:2)
您的图片数据已经过编码,因此您可以简单地编写它:ImageIO.write(img, "jpeg", response.getOutputStream());
。您不需要(也不能)使用JPEGImageEncoder
。
答案 1 :(得分:0)
经典问题。这是一个例子:http://www.exampledepot.com/egs/javax.servlet/GetImage.html
此外,不要在JSP中进行所有编码 - 只保留前端渲染编码;在后端类中进行Java编码。
答案 2 :(得分:0)
糟糕而糟糕的代码。永远不要在JSP中编写控制器逻辑,这就是为什么我有JSP的勇气。您不能将二进制数据写入JSP输出流。该流已初始化为文本输出。将您的逻辑放在servlet中,并使用Commons IO将输入流传输到响应输出流。这会奏效。如果你仍然坚持这个糟糕的解决方案,你将需要编写一个完全包装响应并提供二进制数据的过滤器。请参阅this以获取参考并检查其代码。祝你好运。
编辑:
doGet(...) {
response.setContentType("image/jpeg");
String url = request.getParameter("url");
...
InputStream is = ....getInputStream();
IOUtils.copy(is, response.getOutputStream());
// cleanup
} // done
这是我从本地磁盘管道PDF的方式,但从URL提供服务没有区别。