2014-10-28 110 views
0

我想添加一個函數到我的web應用程序,它可以讓用戶下載一個excel文件。Java HttpServlet如何下載excel文件

我想用下面的代碼來實現這一目標:

@Override 
    public void doPost(HttpServletRequest request, HttpServletResponse response) { 
     File file = new File("d:/test/test.xls"); 
     response.setContentType("application/xls"); 
     response.addHeader("Content-Disposition", "attachment; filename=test.xls"); 
     response.setContentLength((int) file.length()); 

     try { 
      FileInputStream fileInputStream = new FileInputStream(file); 
      OutputStream responseOutputStream = response.getOutputStream(); 
      int bytes; 
      while ((bytes = fileInputStream.read()) != -1) { 
       responseOutputStream.write(bytes); 
      } 
      fileInputStream.close(); 
      responseOutputStream.close(); 

     } catch (FileNotFoundException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

我能下載Excel與上面的代碼文件,但該文件已損壞。如果我用microsoft excel打開它,我會彈出消息:

「文件格式和擴展名不匹配,文件可能已損壞或不安全」。

而excel文件是空的。

運行代碼後,原始文件(d:/test/test.xls)也被破壞。

我在做什麼錯?

+0

確定的Excel文件attemting下載它之前是否有效?它可能是它的過程之前已經損壞了嗎? – icza 2014-10-28 14:58:11

+0

是的,我很確定。 – MeesterPatat 2014-10-28 14:58:28

+0

那麼,有一件事是肯定的,您發佈的代碼肯定不會修改或損壞您的Excel文件。 – icza 2014-10-28 15:00:05

回答

1

Excel文件.xls的官方MIME類型是application/vnd.ms-excel,而.xlsxapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet

此外,我建議在寫入輸出流之前先做response.reset(),然後在關閉response之前寫入responseOutputStream.flush()(重要)。

0

試試下面的代碼:

File file = null; 
    InputStream in = null; 
    OutputStream outstream = null; 
    try { 
     response.reset(); 
     in = new FileInputStream(file); 
     response.setContentType("application/vnd.ms-excel"); 
     response.addHeader("content-disposition", "attachment; filename=data.xls"); 
     outstream = response.getOutputStream(); 
     IOUtils.copyLarge(in, outstream); 
    } 
    catch (Exception e) { 
     out.write("Unable to download file"); 
    }finally { 
     IOUtils.closeQuietly(outstream); 
     IOUtils.closeQuietly(in); 
     IOUtils.closeQuietly(out); 
     if (file != null) 
      file.delete(); 
    } 

不要忘了補充阿帕奇公地IO-2.4在你的依賴