2013-06-01 4 views
0

У меня есть приложение для отображения изображений с использованием imageio на сервлете. Webapp отлично работает при размещении в tomcat 7 с использованием jre 1.6. Но тот же webapp при развертывании на tomcat 5.5 с сервлетом 2.4 и Jre 1.5 он не работает. Чтобы получить доступ к изображению, я передаю идентификатор в качестве параметра, и я получаю изображение, которое является столбцом blob в БД. Первоначально я разработал приложение на экземпляре tomcat 7 с использованием eclipse, и он отлично работал. Совместимость версий компилятора выбрана как 1,5, а версия динамического веб-модуля - 2,4. В приведенном ниже коде я проверил подключение jdbc, он отлично работает и я могу отображать текстовую информацию. Кроме того, я проверил отдельно, имеет ли BufferedImage некоторые данные, проверяя значение null, и, похоже, данные имеют данные. Но сервлет просто не может показать изображение, и я просто получаю пустой экран.отображение изображения на сервлет с использованием imageio java 1.5 update 22

работы по коту 7 [HTTP: // локальный: 8081/testimage/ReturnImage код = AUS]

не работает на TOMCAT 5,5 [Http: // Localhost:? 8080/testimage/ReturnImage код = AUS]

Сервлет просто отображает пустой экран для последнего. Ниже приведен код моего сервлета.

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(); 
     } 
    }  
} 

Image показывает вывод сервлета в двух различных случаях TOMCAT. Tomcat 5.5 использует JDK1.5, а Tomcat 7 использует JDK 1.6

+0

Я добавил response.setContentType ("image/gif"); но все, что я вижу сейчас, это коробка с крестом в ней. –

+0

Я попытался переназначить JVM tomcat 5.5 клиенту jvm.dll jre 1.6 и теперь смог отобразить изображение. Как я могу исправить это, не сообщая об этом более новой версии. Я спрашиваю об этом, потому что я не могу изменять такие настройки в производственной коробке. У более старой JRE уже есть необходимые библиотеки, так что точно не удается. Пожалуйста помоги!!! –

+0

Почему вы декодируете и кодируете изображение в первую очередь? Планируете ли вы с ним сделать обработку изображений, добавьте метаданные, водяные знаки или что-то подобное? Почему бы не потопить blob напрямую, а также правильный тип контента? – haraldK

ответ

0

Возможно, вам необходимо установить setContentType правильно (как вы сейчас это делаете).

Однако, вы пробовали использовать другой формат, например PNG (и, конечно, использовать «image/png» в качестве типа контента)? Я не уверен, что Java 1.5 имеет автора GIF, из-за проблем с лицензированием LZW в прошлом. Обратите внимание, что методы ImageIO.write имеют тип логического возврата, чтобы проверить, было ли что-либо написано. В любом случае PNG всегда должен работать.

PS: Если вы не планируете изменять изображение в сервлете, то, конечно, гораздо быстрее сохранить изображение в правильном формате в блобе и просто передать его клиенту без декодирования/кодирования.

+0

Привет, Харальд, большое спасибо за ваш ответ. Я обнаружил, что логический вывод ImageIO.write был ложным для Jre 1.5, и javadoc говорит, что он возвращает false, если подходящий писатель не найден. Поскольку я возвращал изображение GIF обратно в выходной поток, поэтому он терпел неудачу. Затем я попытался вывести все мои GIF как jpeg и правильно отобразить. Мне оставалось только задаться вопросом, будет ли преобразование всегда правильным, я тестировал его только на 10-20 выборок. Также вы могли бы посоветовать, как я могу передать свой InputStream непосредственно в выходной поток без BufferedImage? –

+0

Не могли бы вы также отметить этот вопрос в ответ. Благодаря!!! –

+0

Добро пожаловать. Но вы задали вопрос, поэтому вы должны отметить это как ответ. Пожалуйста, сделай! – haraldK