Изображение не отображается из таблицы Oracle с помощью сервлета

После долгих проб мне наконец удалось успешно загрузить изображение в oracle database. По крайней мере мой код говорит так. Однако, чтобы проверить, успешно ли было создано изображение, я написал файл servlet. После запуска servlet в моем браузере появляется черный экран и больше ничего. Код servlet:

import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.sql.Blob;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class DisplayImage extends HttpServlet {
private static final long serialVersionUID = 1L;
protected void processRequest(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException  {
    // TODO Auto-generated method stub
     try {
         Class.forName("oracle.jdbc.driver.OracleDriver");  
         String url = "jdbc:oracle:thin:@localhost:1521:XE";
         Connection con = DriverManager.getConnection(url,"system","root");
            PreparedStatement ps = con.prepareStatement("select image from insertimage");
            ResultSet rs = ps.executeQuery();
            rs.next();
            Blob  b = rs.getBlob("image");
            response.setContentType("image/jpeg");
            response.setContentLength( (int) b.length());
            InputStream is = b.getBinaryStream();
            OutputStream os = response.getOutputStream();
            byte buf[] = new byte[(int) b.length()];
            is.read(buf);
            os.write(buf);
            os.close();
        }
        catch(Exception ex) {
             System.out.println(ex.getMessage());
        }
    } 

    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
    } 
    @Override
    protected void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
        processRequest(request, response);
}

  }

Кстати, поскольку я совершенно новичок в этом, мне очень помогла эта загрузка файлов и показать демо. EDIT: я получаю черный экран, если просматриваю его только из FF, но если смотреть из внутреннего веб-браузера Eclipse, он показывает мне одно слово upload. Очень странное поведение!!


person Mistu4u    schedule 30.07.2012    source источник


Ответы (1)


Используйте отладчик или трассировку в коде, чтобы увидеть, что он выполняет.

Используйте Firebug, чтобы увидеть, что содержит ответ.

И исправить чтение и запись из большого двоичного объекта в выходной поток: InputStream.read() не обязательно считывает все байты сразу. Он возвращает количество байтов, которые были фактически прочитаны. Вы должны зацикливаться до тех пор, пока этот метод не вернет -1, чтобы указать, что все было прочитано. Прочтите руководство по Java IO.

person JB Nizet    schedule 30.07.2012
comment
Итак, как изображение может отображаться в браузере? Любая другая процедура!!?? - person Mistu4u; 30.07.2012
comment
также я пробовал зацикливаться, как вы сказали while(is.read()!=-1) { is.read(buf); }, но больше ничего не дало!! - person Mistu4u; 30.07.2012
comment
У вас есть какое-либо сообщение об ошибке на выходе? Что произойдет, если вместо System.out.println(ex.getMessage()) сделать throw new RuntimeException(ex)? Вы прошли через код с помощью отладчика? - person JB Nizet; 30.07.2012
comment
Нет, я не получаю никаких сообщений об ошибках ни в выводе, ни в консоли. Пробовал throws RuntimeException , тоже не повлияло. - person Mistu4u; 31.07.2012
comment
Кстати, я решил проблему. Сервлет отображения работает нормально. Проблема возникает при загрузке. Во время загрузки изображение не вставляется. Я перепроверил это с помощью программного обеспечения для разработчиков SQL. - person Mistu4u; 31.07.2012