Почему мой браузер не получает данных при вызове OutputStream.flush ()? - PullRequest
1 голос
/ 04 января 2012

У меня есть сервлет, который просто читает файл и отправляет его в браузер. Файл корректно перезаписывается, но в OutputStream.flush () браузер не получает данных.

Firefox говорит: "Поврежденная ошибка содержимого Невозможно отобразить страницу, которую вы пытаетесь просмотреть, поскольку обнаружена ошибка в передаче данных. ". Firebug показывает статус" Прервано ".

IE откройте или сохраните пустой файл. Я пробовал маленькие или большие файлы.

Код:

    /** 
     * Processes requests for both HTTP <code>GET</code> and <code>POST</code> methods.
     * @param request servlet request
     * @param response servlet response
     */
    protected void processRequest(HttpServletRequest request, HttpServletResponse response)
            throws ServletException, IOException {
        // Use a ServletOutputStream because we may pass binary information
        response.reset();
        OutputStream out = response.getOutputStream();

        // Get the file to view
        String file = request.getParameter("path");

        // Get and set the type and size of the file
        String contentType = getServletContext().getMimeType(file);
        response.setContentType(contentType);
        long fileSize = (new File(file)).length();
        response.setHeader("Content-Length:", "" + fileSize);

        File f = new File(file);
        response.setHeader("Content-Disposition", "attachment;filename="+f.getName()); 
        response.setContentLength((int) fileSize);

        // Return the file
        try {
            returnFile(file, out, response);
        } catch (Exception e) {
            Logger.getLogger(AffichageItemsServlet.class).error("", e);
        } finally {
            out.close();
        }
    }

    // Send the contents of the file to the output stream
    public static void returnFile(String filename, OutputStream out, HttpServletResponse resp)
            throws FileNotFoundException, IOException {
        FileInputStream fis = null;

        try {
            fis = new FileInputStream(filename);
            byte[] buff = new byte[8* 1024];

            int nbRead = 0;
            while ((nbRead = fis.read(buff, 0, buff.length)) !=-1) {
                out.write(buff, 0, nbRead);
            }

            out.flush();
        } finally {
            if (fis != null) {
                fis.close();
            }
        }
    }

Ответ отправлен на out.flush.

Есть идеи?

1 Ответ

1 голос
/ 04 января 2012

Во-первых, удалите эту строку (ниже вызывается setContentLength ()):

response.setHeader("Content-Length:", "" + fileSize);

Кроме того, вы можете попытаться переместить вызов getOutputStream() непосредственно перед началом использования потока.

...