出于安全的考虑一般情况下,我们会将服务器的文件或者用户上传的文件放在WEB-INF目录的子目录下,所以不能直接通过<a href=""></a>的形式实现静态下载。所以,文件下载的一般流程是,连接设为servlet,然后在servlet中将文件输送到用户客户端。
比如在jsp界面设置如下
- <c:forEach items="${sessionScope.beans }" var="bean" >
-
- <a href="downLoadFileServlet?methodName=downloadfile&id=${bean.id }">${bean.id }</a></span>
然后在servlet 中实现文件的下载,而在servelt中实现下载需要实现如下几个步骤
1)获取文件的信息,比如文件名,文件路径
2)设置response的ContextType
3)设置response的响应头headder
4)通过输入流传送文件,实现下载
2.response.setContextType()
response.setContentType(MIME)的作用是使客户端浏览器,区分不同种类的数据,并根据不同的MIME调用浏览器内不同的程序嵌入模块来处理相应的数据。其中的参数的,大家可以参考这个文章:http://rubyq.iteye.com/blog/1408141
如果不知道如何设置,可以采用如下方法获取ContextType
- <span style="white-space:pre"> </span>String contentType = getServletContext().getMimeType(fileName);
- <span style="font-family: Arial, Helvetica, sans-serif;"><span style="white-space:pre"> </span>if (contentType == null)
- <span style="white-space: pre;"> </span>contentType = "application/octet-stream";
- response.setContentType(contentType);
3.response.addheadder()
这个方法是为了告诉客户端是直接打开文件,还是下载,以及设置下载文件的名称。
当用于下载时,使用方式一般为:
- <span style="white-space:pre"> </span>response.addHeader("Content-Disposition", "attachment;filename=?");<span style="white-space:pre"> </span>
值得注意的是,如果发现配置的文件名出现中文乱码的问题,有如下两种解决方法,
1)
- <span style="white-space:pre"> </span>response.addHeader("Content-Disposition", "attachment;filename="+<span style="font-family: Arial, Helvetica, sans-serif;">java.net.URLEncoder.encode(realName.substring(fileName, "UTF-8"));</span>
2)
- <span style="white-space:pre"> </span> response.setHeader( "Content-Disposition", "attachment;filename=" + new String( fileName.getBytes("gb2312"), "UTF-8" ) );
(以上方法来自于http://www.cnblogs.com/zhycyq/p/3363365.html)
4.实现下载代码
- public void downloadfile(HttpServletRequest request,
- HttpServletResponse response) throws IOException {
- List<FileuploadBean> beans = (List<FileuploadBean>) request
- .getSession().getAttribute("beans");
- String idString = request.getParameter("id");
- FileuploadBean downoadBean = new FileuploadBean();
- Integer id = Integer.parseInt(idString);
- for (FileuploadBean bean : beans) {
- if (bean.getId() == id) {
- downoadBean = bean;
- break;
- }
- }
- String realName = downoadBean.getFileName();
- <pre name="code" class="java"><span style="white-space:pre"> </span>
// 根据文件的类型设置response对象的ContentTypeString contentType = getServletContext().getMimeType(realName.substring(realName.lastIndexOf("\\")+1));if (contentType == null)contentType = "application/octet-stream";response.setContentType(contentType);
//设置addheaderresponse.addHeader("Content-Disposition", "attachment;filename="+ java.net.URLEncoder.encode(realName.substring(realName.lastIndexOf("\\")+1), "UTF-8"));
- <span style="white-space:pre"> </span>
- InputStream inputStream = null;
- OutputStream outputStream = null;
- try {
- inputStream = new FileInputStream(downoadBean.getFilePath());
- byte[] buffer = new byte[1024];
- int len = 0;
- outputStream = response.getOutputStream();
- while ((len = inputStream.read(buffer)) != -1)
- outputStream.write(buffer, 0, len);
- } catch (Exception e) {
- e.printStackTrace();
- } finally {
- outputStream.close();
- inputStream.close();
- }
-
- }