在servlet上丢失图像?

时间:2013-09-15 23:16:57

标签: java image tomcat servlets

我的情况非常奇怪。我正在运行一个在Tomcat上返回图像的servlet。

我正在尝试运行此代码:                 FabricaControladores fabrica = FabricaControladores.getInstance();

      String nombreProveedor = request.getParameter("nombre");

      IVerInformacionDeProveedor infoProveedor = fabrica.getIVerInformacionDeProveedor();

        infoProveedor.SeleccionarProveedor(nombreProveedor);

       DataProveedor data = infoProveedor.VerInformacionProveedor();

       image = data.getImagen();


        BufferedImage bImage = new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);
        Graphics2D graphics = bImage.createGraphics();

        graphics.drawImage(image,0,0,null);

        graphics.dispose();

        response.setContentType("image/jpeg");  
        OutputStream out = response.getOutputStream();  
        ImageIO.write(bImage, "jpeg", out);
        out.close(); 

当我运行它时,我收到此错误:

   HTTP Status 500 - Width (-1) and height (-1) cannot be <= 0

   type Exception report

   message Width (-1) and height (-1) cannot be <= 0

   description The server encountered an internal error that prevented it from fulfilling this request.

   exception

   java.lang.IllegalArgumentException: Width (-1) and height (-1) cannot be <= 0
       java.awt.image.DirectColorModel.createCompatibleWritableRaster(DirectColorModel.java:1016)
java.awt.image.BufferedImage.<init>(BufferedImage.java:331)
MostrarImagen.doGet(MostrarImagen.java:110)
javax.servlet.http.HttpServlet.service(HttpServlet.java:621)
javax.servlet.http.HttpServlet.service(HttpServlet.java:728)

   note The full stack trace of the root cause is available in the Apache Tomcat/7.0.42 logs.
   Apache Tomcat/7.0.42

非常奇怪的是,使用非常类似的方法在SWING应用程序中获取图像时,它可以正常工作。

当我使用:

直接加载图像时
   new ImageIcon(getClass().getResource("/Imagens/TC.jpg")).getImage())

它完美地展示了它。

就像图像在某处丢失或损坏一样。有什么想法吗?

修改

DATA PROVEEDOR

  public class DataProveedor{

private String _nickname, _nombreCompania, _nombre, _apellido, _correo, _paginaWeb;
Image _imagen;
private Date _fechaNacimiento;
private Hashtable<Integer,DataProducto> _productos;

 public DataProveedor(String nickname, String nombreCompania,
        String nombre, String apellido, String correo,
        String paginaWeb, Date fechaNacimiento,
        Hashtable<Integer, DataProducto> productos) {
    this._nickname = nickname;
    this._nombreCompania = nombreCompania;
    this._nombre = nombre;
    this._apellido = apellido;
    this._correo = correo;
    this._imagen = null;
    this._paginaWeb = paginaWeb;
    this._fechaNacimiento = fechaNacimiento;
    this._productos = productos;
}



   public DataProveedor(String nickname,String nombreCompania,
    String nombre, String apellido, String correo, 
    String paginaWeb, Date fechaNacimiento,
    Hashtable<Integer, DataProducto> productos, Image imagen) {
this._nickname = nickname;
this._nombreCompania = nombreCompania;
this._nombre = nombre;
this._apellido = apellido;
this._correo = correo;
this._imagen = imagen;
this._paginaWeb = paginaWeb;
this._fechaNacimiento = fechaNacimiento;
this._productos = productos;
   }

public String getNickname() {
    return _nickname;
}

public String getNombreCompania() {
    return _nombreCompania;
}

public String getNombre() {
    return _nombre;
}

public String getApellido() {
    return _apellido;
}

public String getCorreo() {
    return _correo;
}

    public Image getImagen() {
    return _imagen;
}

public String getPaginaWeb() {
    return _paginaWeb;
}

public Date getFechaNacimiento() {
    return _fechaNacimiento;
}

public Hashtable<Integer, DataProducto> getProductos() {
    return _productos;
}

** VER INFO **

    @Override
public DataProveedor VerInformacionProveedor() {
    return _proveedor.GetDataProveedor();
}

** GetDataProveedor **

 public DataProveedor GetDataProveedor()
{

    Hashtable<Integer, DataProducto>productos = new Hashtable<Integer, DataProducto>();

    for(Producto p : _productos.values())
    {
        DataProducto ip = p.GetInfo();
        productos.put(new Integer(ip.get_id()), ip);
    }
    DataProveedor dp;
    if(this._imagen == null)
    dp = new DataProveedor(GetNickname(),GetNombreCompania(),GetNombre(),GetApellido(),
            GetCorreo(),GetPaginaWeb(),GetFechaNacimiento(),productos);
    else
    dp = new DataProveedor(GetNickname(),GetNombreCompania(),GetNombre(),GetApellido(),GetCorreo(),
            GetPaginaWeb(),GetFechaNacimiento(),productos,this._imagen.getImagen());
    return dp;
}

** DataProveedor **

    public DataProveedor(String nickname, String nombreCompania,
        String nombre, String apellido, String correo,
        String paginaWeb, Date fechaNacimiento,
        Hashtable<Integer, DataProducto> productos) {
    this._nickname = nickname;
    this._nombreCompania = nombreCompania;
    this._nombre = nombre;
    this._apellido = apellido;
    this._correo = correo;
    this._imagen = null;
    this._paginaWeb = paginaWeb;
    this._fechaNacimiento = fechaNacimiento;
    this._productos = productos;
}



   public DataProveedor(String nickname,String nombreCompania,
    String nombre, String apellido, String correo, 
    String paginaWeb, Date fechaNacimiento,
    Hashtable<Integer, DataProducto> productos, Image imagen) {
this._nickname = nickname;
this._nombreCompania = nombreCompania;
this._nombre = nombre;
this._apellido = apellido;
this._correo = correo;
this._imagen = imagen;
this._paginaWeb = paginaWeb;
this._fechaNacimiento = fechaNacimiento;
this._productos = productos;
    }

1 个答案:

答案 0 :(得分:1)

包含

的行
new BufferedImage(image.getWidth(null), image.getHeight(null), BufferedImage.TYPE_INT_RGB);

失败,因为image.getWidth(null)image.getHeight(null)中的一个或两个都返回-1

我不确切知道image的来源,但它似乎是java.awt.Image的一个实例。这些映像是异步的,用于Applet或其他GUI应用程序。您遇到的问题是因为图像的异步加载尚未发生,并且图像的尺寸仍然未知。

代码使用image = new ImageIcon(...).getImage()的原因是因为ImageIcon构造函数具有确保图像在返回之前完全加载的代码。

对于服务器端应用程序,使用BufferedImage可以让自己的生活更轻松。您可以使用BufferedImage阅读ImageIO.read(...)