Servlets 使用imageio java 1.5 update 22在servlet上显示图像

Servlets 使用imageio java 1.5 update 22在servlet上显示图像,servlets,javax.imageio,tomcat5.5,Servlets,Javax.imageio,Tomcat5.5,我有一个在servlet上使用imageio显示图像的Web应用程序。当使用jre 1.6托管在Tomcat7中时,webapp工作正常。但同样的webapp在部署到带有Servlet2.4和Jre 1.5的Tomcat5.5上时不起作用。为了访问该图像,我将标识符作为参数传递,然后得到该图像,它是DB中的blob列。最初,我使用eclipse在Tomcat7实例上开发了该应用程序,效果很好。编译器版本兼容性选择为1.5,动态web模块版本选择为2.4。在下面的代码中,我检查了jdbc连接,它工

我有一个在servlet上使用imageio显示图像的Web应用程序。当使用jre 1.6托管在Tomcat7中时,webapp工作正常。但同样的webapp在部署到带有Servlet2.4和Jre 1.5的Tomcat5.5上时不起作用。为了访问该图像,我将标识符作为参数传递,然后得到该图像,它是DB中的blob列。最初,我使用eclipse在Tomcat7实例上开发了该应用程序,效果很好。编译器版本兼容性选择为1.5,动态web模块版本选择为2.4。在下面的代码中,我检查了jdbc连接,它工作正常,我可以显示文本信息。此外,我还通过检查null来分别检查BuffereImage是否有一些数据,它似乎有数据。但是servlet根本无法显示图像,我最终得到一个空白屏幕

在Tomcat7上工作 [http://localhost:8081/testimage/ReturnImage?code=AUS]

在tomcat 5.5上不起作用 [http://localhost:8080/testimage/ReturnImage?code=AUS]

servlet只为后者显示一个空白屏幕。 下面是我的servlet的代码

package flags;

import java.io.IOException;
import java.io.OutputStream;
import java.io.PrintWriter;
import javax.imageio.ImageIO;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.sql.*;
import java.awt.image.BufferedImage;

public class ReturnImage extends HttpServlet {
    private static final long serialVersionUID = 1L;

    public void doGet(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {

        //PrintWriter out = response.getWriter();
        // OutputStream outimg = response.getOutputStream();

        try {
            Class.forName("com.mysql.jdbc.Driver");

            Connection connection = DriverManager.getConnection(
                    "jdbc:mysql://192.168.2.2:3306/world", "root", "abcdef");

            //out.println("Connecting to database <br>");

            Statement statement = connection.createStatement();
            String param;
                param = request.getParameter("code");

            String sql = "Select Name,Flag,Code from world.Country where Code='"+ param + "'";
            ResultSet res = statement.executeQuery(sql);
            while (res.next()) {
                String Name = res.getString("Name");
                String Code = res.getString("Code");
                BufferedImage image = javax.imageio.ImageIO.read(res.getBlob("Flag").getBinaryStream());
                //out.println(System.getProperty("java.runtime.version"));
                //out.println(Code + " ");
                //out.println(Name + "<br>");
                if (image == null) {
                    //out.println("null image");
                }
                 ImageIO.write(image, "gif", outimg);
                 outimg.close();        
            }
            res.close();
            statement.close();
            connection.close();

        } catch (SQLException e) {
            e.printStackTrace();
        } catch (Exception e) {
            e.printStackTrace();
        }   
    }       
}
包标志;
导入java.io.IOException;
导入java.io.OutputStream;
导入java.io.PrintWriter;
导入javax.imageio.imageio;
导入javax.servlet.ServletException;
导入javax.servlet.http.HttpServlet;
导入javax.servlet.http.HttpServletRequest;
导入javax.servlet.http.HttpServletResponse;
导入java.sql.*;
导入java.awt.image.buffereImage;
公共类ReturnImage扩展了HttpServlet{
私有静态最终长serialVersionUID=1L;
public void doGet(HttpServletRequest请求、HttpServletResponse响应)
抛出ServletException、IOException{
//PrintWriter out=response.getWriter();
//OutputStream outimg=response.getOutputStream();
试一试{
Class.forName(“com.mysql.jdbc.Driver”);
Connection Connection=DriverManager.getConnection(
“jdbc:mysql://192.168.2.2:3306/world“,”根“,”abcdef”);
//out.println(“连接到数据库
”; 语句Statement=connection.createStatement(); 字符串参数; param=request.getParameter(“代码”); String sql=“从世界各地选择名称、标志、代码,其中代码=”+param+“”; ResultSet res=statement.executeQuery(sql); while(res.next()){ 字符串名称=res.getString(“名称”); 字符串代码=res.getString(“代码”); buffereImage image=javax.imageio.imageio.read(res.getBlob(“Flag”).getBinaryStream()); //println(System.getProperty(“java.runtime.version”); //out.println(代码+“”); //out.println(名称+“
”); if(image==null){ //out.println(“空图像”); } 写入(图像,“gif”,输出图像); outimg.close(); } res.close(); 语句。close(); connection.close(); }捕获(SQLE异常){ e、 printStackTrace(); }捕获(例外e){ e、 printStackTrace(); } } }

显示两个不同tomcat实例中的servlet输出。Tomcat5.5使用JDK1.5,Tomcat7使用JDK1.6,您可能需要正确设置setContentType(正如您目前所做的那样)

但是,您是否尝试过使用不同的格式,如PNG(当然,使用“image/PNG”作为内容类型)?由于过去的LZW许可问题,我不确定Java1.5是否有GIF编写器。请注意,ImageIO.write方法有一个布尔返回类型,用于检查是否写入了任何内容。在任何情况下,PNG都应该始终有效


PS:除非您计划在servlet中修改图像,否则以正确的格式将图像存储在blob中,并将其传递给客户端而无需对其进行解码/编码,当然要快得多。

I添加了response.setContentType(“image/gif”);但我现在看到的只是一个有十字架的盒子,我尝试将Tomcat5.5的JVM重新写入jre 1.6的客户机JVM.dll,现在可以显示图像了。如何在不向新版本报告的情况下修复此问题。我问这个问题是因为我不能在生产框上修改任何这样的设置。较旧的JRE已经有了所需的库,那么到底是什么失败了呢。请帮忙!!!你为什么要首先对图像进行解码和编码?您是否计划使用它进行任何图像处理,添加元数据、水印或类似内容?为什么不直接将blob和适当的内容类型一起流式传输呢?嗨,Harald,非常感谢你的回答。我发现,对于Jre 1.5,ImageIO.write的布尔输出为false,而javadoc表示,如果找不到合适的writer,它将返回false。因为我正在将GIF图像写回outputstream,所以失败了。然后我试着将我所有的GIF输出为jpeg格式,并正确显示。我唯一想知道的是转换是否总是正确的,我只测试了10-20个样本。另外,您能给我一些建议吗?如果没有BuffereImage,我如何将InputStream直接传递到outputstream?不客气。但是你问了这个问题,所以你必须把它标记为已回答。请做!有关如何将输入复制到输出,请参见本文中的代码示例。我的信誉点似乎不足以将答案标记为有用:-)有关详细信息,请参见此