2012-01-04 9 views
1

ファイルを読み込んでブラウザに送信するサーブレットがあります。 ファイルは正しく読み込まれますが、OutputStream.flush()でブラウザはデータを受け取りません。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" に送信されます。

+0

getParameter( "path")は、ファイル名の絶対パスまたはファイル名のみを返しますか? – adatapost

答えて

1

一つには、この行を削除する(あなたはその下のsetContentLength()を呼び出し):

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

また、あなたは、ストリームの使用を開始する直前にgetOutputStream()コールを移動してみてください。

+0

ありがとう!この行を削除する: response.setHeader( "Content-Length:"、 "" + fileSize); は私の問題を解決しました。 –

関連する問題