文件下载时出错

在我的servlet中,我使用cookies传递文件path并下载文件如下

protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException { // TODO Auto-generated method stub String b = null; Cookie[] cookies = request.getCookies(); if (cookies != null) { for (Cookie cookie : cookies) { if (cookie.getName().equals("thecookie")) { b = cookie.getValue(); } } } BufferedReader br = new BufferedReader(new FileReader(b+"/logs.txt")); String path = br.readLine(); br.close(); File file = new File(path+"/Results.xlsx"); FileInputStream fileIn = new FileInputStream(file); ServletOutputStream out = response.getOutputStream(); byte[] outputByte = new byte[4096]; //copy binary contect to output stream while(fileIn.read(outputByte, 0, 4096) != -1) { out.write(outputByte, 0, 4096); } fileIn.close(); out.flush(); out.close(); } 

一切工作正常,文件正在下载,但是,我想下载Results.xlsx和正在下载的文件是download.zipdownload.zip是与我的Results.xlsx文件相同的大小,但没有得到由Excel打开。

我如何做到这一点?

您正在将数据写入输出stream,但是您没有设置内容types或文件名。 你应该使用:

 response.setHeader("Content-Disposition", "attachment; filename=Result.xslx"); response.setContentType( "application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); 

(在开始写入输出stream之前)

另外,你的stream复制循环被破坏了 – 即使你没有多读,也总是写出4096个字节。 它应该是:

 int bytesRead; while((bytesRead = fileIn.read(outputByte)) != -1) { out.write(outputByte, 0, byteRead); } 

…你应该使用try-with-resources或者finally块来确保你closures你的stream,即使有一个exception。

(或使用Guava等库中的实用方法。)