2013-09-15 2 views
0

Я нахожусь в очень странной ситуации. Я запускаю сервлет, который возвращает изображение на Tomcat.Потеря изображения на сервлет?

Я пытаюсь запустить этот код: 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()) 

это показывает, что он отлично.

Как изображение потеряно или повреждено где-то. Есть идеи?

EDIT

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; 
    } 
+0

Просьба показать код для 'infoProveedor.VerInformacionProveedor();' и для класса DataProveedor. –

ответ

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(...).

+0

Большое спасибо! Фактически, по какой-то странной причине он теперь работает. Я сделал некоторые изменения на загрузчике, я думаю, что каким-то образом я заставил загрузку изображения и начал работать. Если я когда-нибудь пойму, почему он начал работать, я поделюсь. Огромное спасибо! – bgarate

 Смежные вопросы

  • Нет связанных вопросов^_^