Java快速开发平台

www.fastunit.com

  BlogJava :: 首页 :: 联系 :: 聚合  :: 管理
  23 Posts :: 0 Stories :: 273 Comments :: 0 Trackbacks

一、如何使用

如果此Servlet命名为download,请求的URL为:/download?path=xxx,请求后出现下载窗口:

download.gif

二、源码

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();
    }
  }

}

三、web.xml配置

<servlet>
    
<servlet-name>FileDownload</servlet-name>
    
<servlet-class>com.fastunit.test.FileDownload</servlet-class>
</servlet>
<servlet-mapping>
    
<servlet-name>FileDownload</servlet-name>
    
<url-pattern>/download</url-pattern>
</servlet-mapping>

四、补充说明

本例只是一个简单实现,应用时需要在实际环境中处理以下问题:
1. 权限问题:结合实际系统增加用户权限控制
2. 中文文件名:中文问题与运行环境有关,不同环境下解决方式也有差异,一般可通过转码来解决。
3. 文件类型:文件类型统一时可直接指定,如res.setContentType("application/zip");文件类型不确定时可不设、设一个不存在的、或通过解析文件名后缀来设置,以实际测试通过为准。

posted on 2008-01-22 14:26 FastUnit 阅读(12001) 评论(4)  编辑  收藏 所属分类: Java

Feedback

# re: Servlet实现文件下载的源码 2008-01-23 18:15 stoneshao
需要修正的几个地方:
1。中文文件名乱码
2。mime的信息  回复  更多评论
  

# re: Servlet实现文件下载的源码 2008-01-24 19:39 FastUnit
@stoneshao
原文不够严谨,这两点确实是关键之处,已根据你的提议在文中增加了补充说明。  回复  更多评论
  

# re: Servlet实现文件下载的源码 2010-06-13 14:15 一个好人
如果文件的大小超过50M,这个好像行不通吧  回复  更多评论
  

# re: Servlet实现文件下载的源码[未登录] 2014-03-18 13:32 java爱好者
把流文件不写到前端浏览器而是用户自己指定的文件如何改啊
急求救
  回复  更多评论
  


只有注册用户登录后才能发表评论。


网站导航: