Изображение не подается внутри JSP от сервлетов - PullRequest
0 голосов
/ 22 апреля 2011

У меня есть jsp, в котором для каждой строки таблицы мне нужно отобразить изображение, присутствующее в базе данных.Я извлекаю все данные строки таблицы из базы данных, включая изображения в виде Blob, и сохраняю их в бине.Изображение сохраняется в bean-компоненте в виде байтового массива, например:

photo = rs.getBlob("PHOTO");
photoByteArray = photo.getBytes(1, (int)photo.length());

При циклическом перемещении по списку bean-компонентов в jsp атрибут src указывает на такой сервлет:

<img class="img" width="55" height="50" src="displayThumbnail?photoData=${part.photoData}">

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

protected void processRequest(HttpServletRequest request, HttpServletResponse response) throws IOException {
    response.setContentType("image/jpeg");
    OutputStream o = response.getOutputStream();
    String photoDataStr = request.getParameter("photoData");
    byte[] photoData = null;
    if(photoDataStr != null) {
        photoData = photoDataStr.getBytes();
    }
    o.write(photoData);
    o.close();
}

Однако изображение не отображается.Теперь, если я сделаю запрос в базу данных для каждого отдельного изображения, как показано ниже, изображения в этом случае будут отображаться нормально.

protected void processRequest(HttpServletRequest request, HttpServletResponse response) {
    PreparedStatement pstmt = null;
    ResultSet rs = null;
    Connection conn = null;
            try {
        if(conn == null) {
            conn = open();
        }
        pstmt = conn.prepareStatement("select photo from PART_PHOTOS where id = ?");
        String id = request.getParameter("id");
        pstmt.setString(1, id);
        rs = pstmt.executeQuery();
        if (rs.next()) {
            Blob b = rs.getBlob("photo");
            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();
            is.close();
        }
    } catch (Exception ex) {
        System.out.println(ex.getMessage());
        ex.printStackTrace();
    } finally {
         if (rs != null) {
            try {
                rs.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            rs = null;
        }
        if (pstmt != null) {
            try {
                pstmt.close();
            } catch (SQLException e) {
                e.printStackTrace();
            }
            pstmt = null;
        }
        //check if it's the end of the loop
            if (conn != null) {
                    try {
                        conn.close();
                    } catch (SQLException e) {
                        e.printStackTrace();
                    }
                    conn = null;
                }
    }
}

Я был бы очень признателен, если бы кто-нибудь мог дать какие-либо рекомендации примерно так же.

Ответы [ 3 ]

0 голосов
/ 22 апреля 2011

Ваш первый фрагмент processRequest () отправляет обратно только байтовое представление параметра запроса photoData, а не данные фотографии, определенные этим параметром. Выглядит как ошибка в вашем коде.

Кажется, вы пытаетесь решить свою проблему неправильно. При первом создании таблицы HTML сохранение изображения в вашем «bean-компоненте» из первого запроса ничего не дает, если только вы не кэшируете данные, а последующий запрос displayThumbnail извлекает изображение из кэша, избегая запроса к базе данных.

Если вы не хотите возиться с кэшированием, то нет необходимости сохранять изображение в исходном бине, поскольку он ничего не дает, а просто делать что-то вроде вашего второго фрагмента processRequest (), чтобы получить изображение непосредственно, когда браузер запрашивает это.

0 голосов
/ 22 апреля 2011

Ваше ${part.photoData} выражение должно возвращать некоторый идентификатор. В методе processRequest () вы должны получить это значение идентификатора (с помощью request.getParameter ("photoData")) и по этому значению получить изображение из базы данных (или лучше из кеша или из файловой системы) и отправить двоичные данные веб-клиенту .

0 голосов
/ 22 апреля 2011

Вы предполагаете, что можете поместить случайные двоичные данные в файл HTML, и они будут правильно проанализированы и отправлены обратно на ваш сервер без изменений. Это плохое предположение! Если ничто иное, байт, который соответствует ASCII для символа кавычки, вызовет проблемы, правильно? Не говоря уже о проблемах кодирования, а также о том, что параметры URL-адреса должны быть кодированы. Это просто обречено на провал.

Чтобы это работало, вам нужно иметь какое-то явное текстовое кодирование двоичных данных, когда вы обслуживаете страницу (возможно, base64), а затем декодировать параметр сервлета обратно в данные двоичного изображения после URL-адреса. отправил назад.

...