六狼论坛

 找回密码
 立即注册

QQ登录

只需一步,快速开始

新浪微博账号登陆

只需一步,快速开始

搜索
查看: 45|回复: 0

【转】Servlet实现文件下载的源码

[复制链接]

升级  12.67%

15

主题

15

主题

15

主题

秀才

Rank: 2

积分
69
 楼主| 发表于 2013-1-17 23:56:38 | 显示全部楼层 |阅读模式
一、如何使用

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

二、源码
<div style="padding-right: 5px; padding-left: 4px; font-size: 13px; padding-bottom: 4px; width: 1086px; padding-top: 4px; background-color: #eeeeee; border: 1px solid #cccccc;">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();
    }
  }

}
您需要登录后才可以回帖 登录 | 立即注册 新浪微博账号登陆

本版积分规则

快速回复 返回顶部 返回列表