Одесса: 5°С (вода 9°С)
Киев: 0°С
Львов: 0°С

Тема: JSP вывод бинарного файла(картинки)

Ответить в теме
Показано с 1 по 3 из 3
  1. Вверх #1

    По умолчанию JSP вывод бинарного файла(картинки)

    Есть jsp страница
    Код:
    <%@ page contentType="image/JPEG" %><%
      pageContext.setAttribute("Content-Length", request.getAttribute("length"));
      byte[] PictureBytes = (byte[]) request.getAttribute("picture");
      java.io.DataOutputStream dout = new java.io.DataOutputStream (new java.io.BufferedOutputStream(response.getOutputStream()));
      dout.write(PictureBytes);
      dout.close();
    %>
    выкидывает ошибку, но работает
    Код:
    StandardWrapperValve[action]: Servlet.service() for servlet action threw exception
    java.lang.IllegalStateException: getOutputStream() has already been called for this response
    Если выводить данные по правильному, т.е. через out.write или out.print - такое чувство, что тип данных байт переводится в чар с потерей старшего бита (
    Кто сталкивался с подобной проблемой - поделитесь решением
    PS JDK 1.4.2


  2. Вверх #2
    когда-то я подобное делал путём переписывания javax.servlet.jsp.JspWriter (класс объекта out). Ни у кого нет этого переписанного класса?

    ЗЫ проверил на jdk 1.5 и 1.6 та же лажа (

  3. Вверх #3
    вот наиболее (на мой взгляд) правильное решение этой проблемы
    источник http://www.mooreds.com/wordpress/archives/000018

    The JSP is taking my stream before my code has a chance. Therefore, I get an “getOutputStream() has already been called for this response” error. The weird bit is that this doesn’t seem to happen on Tomcat 4.1.24 on Windows (same version of struts).

    So, what do you do? You write a servlet instead. That way you have utter control over the output stream:

    —————


    import javax.servlet.http.*;
    import javax.servlet.*;
    import java.io.*;

    public class BinaryStreamServlet extends HttpServlet {

    public void service(HttpServletRequest req, HttpServletResponse res)
    throws ServletException, IOException {
    String contentType =
    (String)req.getAttribute("contentType");
    if (contentType == null || "".equals(contentType)) {
    contentType = "image/png"; // default
    }
    res.reset();
    res.setContentType(contentType);
    OutputStream sos = res.getOutputStream();
    ByteArrayOutputStream baos = (ByteArrayOutputStream)req.getAttribute("baos");
    baos.writeTo(sos);
    }
    }
    —————

    I set up my action classes to cache the ByteArrayOutputStream in the request, with the name “baos.” I added these lines to my web.xml:

    —————

    <servlet>
    <servlet-name>binaryFileServlet</servlet-name>
    <servlet-class>BinaryStreamServlet</servlet-class>
    </servlet>
    ....snip...
    <servlet-mapping>
    <servlet-name>binaryFileServlet</servlet-name>
    <url-pattern>/binaryFile</url-pattern>
    </servlet-mapping>
    —————

    and this to my struts-config.xml for any actions that needed to be able to send binary data:

    —————
    <forward name="success" path="/binaryFile"/>
    —————

    Works like a charm. Leave the JSPs to the character data, and use this simple servlet for binary delivery.


    ЗЫ зачем, однако, тему открывал ?
    ЗЫЫ как закрыть тему?
    ЗЫЫЫ никому джава програмер не нужен?
    ЗЫЫЫЫ всёравно я делал как-то по другому (склероз)

Ответить в теме

Похожие темы

  1. Падает коннект к базе в JSP
    от bilbo в разделе Программирование
    Ответов: 4
    Последнее сообщение: 29.05.2009, 14:06
  2. Прога для ASP и JSP
    от NoXX в разделе Программное обеспечение
    Ответов: 0
    Последнее сообщение: 06.07.2006, 12:15

Социальные закладки

Социальные закладки

Ваши права

  • Вы не можете создавать новые темы
  • Вы не можете отвечать в темах
  • Вы не можете прикреплять вложения
  • Вы не можете редактировать свои сообщения