отображать изображение на сервлете с помощью imageio java 1.5 update 22

У меня есть веб-приложение для отображения изображений с помощью imageio на сервлете. Веб-приложение отлично работает при размещении в tomcat 7 с использованием jre 1.6. Но то же веб-приложение при развертывании на tomcat 5.5 с сервлетом 2.4 и Jre 1.5 не работает. Чтобы получить доступ к изображению, я передаю идентификатор в качестве параметра и получаю изображение, которое представляет собой столбец BLOB-объектов в БД. Первоначально я разработал приложение на экземпляре tomcat 7 с использованием eclipse, и оно работало нормально. Совместимость версии компилятора выбрана как 1.5, а версия динамического веб-модуля — 2.4. В приведенном ниже коде я проверил подключение jdbc, оно работает нормально, и я могу отображать текстовую информацию. Также я отдельно проверил, есть ли у BufferedImage некоторые данные, проверив значение null, и, похоже, у него есть данные. Но сервлет просто не отображает изображение, и я просто получаю пустой экран.

работает на tomcat 7 [http://localhost:8081/testimage/ReturnImage?code=AUS]

не работает на tomcat 5.5 [http://localhost:8080/testimage/ReturnImage?code=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();
        }   
    }       
}

Изображение показывает вывод сервлета в двух разных экземплярах tomcat. Tomcat 5.5 использует JDK1.5, а Tomcat 7 использует JDK 1.6.


person Dhirendra Khanka    schedule 01.06.2013    source источник
comment
Я добавил response.setContentType(image/gif); но все, что я вижу сейчас, это коробка с крестом внутри.   -  person Dhirendra Khanka    schedule 01.06.2013
comment
Я попытался перенаправить JVM tomcat 5.5 на клиент jvm.dll jre 1.6 и теперь могу отображать изображение. Как я могу исправить это, не сообщая об этом в более новой версии. Я спрашиваю об этом, потому что я не могу возиться с такими настройками на производственной коробке. В более старой JRE уже есть необходимые библиотеки, так что именно не получается. Пожалуйста помоги!!!   -  person Dhirendra Khanka    schedule 01.06.2013
comment
Почему вы декодируете и кодируете изображение в первую очередь? Планируете ли вы выполнять с ним какую-либо обработку изображений, добавлять метаданные, водяные знаки или что-то подобное? Почему бы не передать большой двоичный объект напрямую вместе с соответствующим типом содержимого?   -  person Harald K    schedule 03.06.2013


Ответы (1)


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

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

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

person Harald K    schedule 02.06.2013
comment
Привет Харальд, большое спасибо за ваш ответ. Я обнаружил, что логический вывод ImageIO.write был ложным для Jre 1.5, а javadoc говорит, что он возвращает false, если не найден подходящий писатель. Поскольку я писал изображение GIF обратно в выходной поток, это не удавалось. Затем я попытался вывести все свои GIF-файлы в формате jpeg и правильно отобразить их. Единственное, что мне осталось задаться вопросом, всегда ли преобразование будет правильным, я проверил его только для 10-20 образцов. Также не могли бы вы посоветовать, как я могу передать свой InputStream напрямую в outputstream без BufferedImage? - person Dhirendra Khanka; 03.06.2013
comment
Пожалуйста. Но вы задали вопрос, поэтому вы должны пометить его как ответ. Пожалуйста, сделай! - person Harald K; 04.06.2013
comment
Чтобы узнать, как скопировать ввод в вывод, см. пример кода в этом ответе. - person Harald K; 04.06.2013
comment
Моих очков репутации недостаточно, чтобы отметить ответ как полезный :-) - person Dhirendra Khanka; 04.06.2013
comment
См. здесь Как пометить ответ на вопрос - person Harald K; 04.06.2013