转:Servlet下载2
import java.io.BufferedInputStream; import java.io.BufferedOutputStream; import java.io.File; import java.io.FileInputStream; import java.io.IOException; import javax.servlet.ServletException; import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServlet; import javax.servlet.http.HttpServletRequest; import javax.servlet.http.HttpServletResponse; public class FileDownload extends HttpServlet { protected void service(HttpServletRequest req, HttpServletResponse res) throws ServletException, IOException { // 服务器相对路径 String path = req.getParameter("path"); // 服务器绝对路径 path = getServletContext().getRealPath("/") + path; // 检查文件是否存在 File obj = new File(path); if (!obj.exists()) { res.setContentType("text/html;charset=GBK"); res.getWriter().print("指定文件不存在!"); return; } // 读取文件名:用于设置客户端保存时指定默认文件名 int index = path.lastIndexOf("\\"); // 前提:传入的path字符串以“\”表示目录分隔符 String fileName = path.substring(index + 1); // 写流文件到前端浏览器 ServletOutputStream out = res.getOutputStream(); res.setHeader("Content-disposition", "attachment;filename=" + fileName); BufferedInputStream bis = null; BufferedOutputStream bos = null; try { bis = new BufferedInputStream(new FileInputStream(path)); bos = new BufferedOutputStream(out); byte[] buff = new byte[2048]; int bytesRead; while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) { bos.write(buff, 0, bytesRead); } } catch (IOException e) { throw e; } finally { if (bis != null) bis.close(); if (bos != null) bos.close(); } } }
本例只是一个简单实现,应用时需要在实际环境中处理以下问题:
1. 权限问题:结合实际系统增加用户权限控制
2.
中文文件名:中文问题与运行环境有关,不同环境下解决方式也有差异,一般可通过转码来解决。
3.
文件类型:文件类型统一时可直接指定,如res.setContentType("application/zip");文件类型不确定时可不设、设一个不存在的、或通过解析文件名后缀来设置,以实际测试通过为准。
测试:
- response.setContentType("Application/Octet-stream;charset=utf-8"); 这样写很方便
response.setContentType()的String参数及对应类型
<option value="image/bmp">BMP</option>
<option value="image/gif">GIF</option>
<option value="image/jpeg">JPEG</option>
<option value="image/tiff">TIFF</option>
<option value="image/x-dcx">DCX</option>
<option value="image/x-pcx">PCX</option>
<option value="text/html">HTML</option>
<option value="text/plain">TXT</option>
<option value="text/xml">XML</option>
<option value="application/afp">AFP</option>
<option value="application/pdf">PDF</option>
<option value="application/rtf">RTF</option>
<option value="application/msword">MSWORD</option>
<option value="application/vnd.ms-excel">MSEXCEL</option>
<option value="application/vnd.ms-powerpoint">MSPOWERPOINT</option>
<option value="application/wordperfect5.1">WORDPERFECT</option>
<option value="application/vnd.lotus-wordpro">WORDPRO</option>
<option value="application/vnd.visio">VISIO</option>
<option value="application/vnd.framemaker">FRAMEMAKER</option>
<option value="application/vnd.lotus-1-2-3">LOTUS123</option>