文件上传与下载--下载

1、下载servlet

public class DownLoadServlet extends HttpServlet{
    /**
     * 
     */
    private static final long serialVersionUID = 1L;
    @Override
    protected void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
        //获取用户下载的文件名称(url地址后追加数据,get)
        String fileName = request.getParameter("fileName");

        //获取上传目录路径
        String filePath = getServletContext().getRealPath("/upload")+"/"+fileName;
        BufferedInputStream bis = null;
        BufferedOutputStream bos = null;

        bis = new BufferedInputStream(new FileInputStream(filePath));
        bos = new BufferedOutputStream(response.getOutputStream());
        long fileLength = new File(filePath).length();

        response.setCharacterEncoding("UTF-8");
        response.setContentType("multipart/form-data");
        /*
         * 解决各浏览器的中文乱码问题
         */

        String userAgent = request.getHeader("User-Agent");
        //IE浏览器的编码设置
       if(userAgent.contains("MSIE") 
           ||userAgent.contains("rv:11")){
          fileName = URLEncoder.encode(fileName, "UTF-8");
       } else{
          fileName = new String(fileName.getBytes("UTF-8"), "ISO-8859-1");
        }
        response.setHeader("Content-disposition",
                String.format("attachment; filename=\"%s\"", fileName));

        response.setHeader("Content-Length", String.valueOf(fileLength));
        byte[] buff = new byte[2048];
        int bytesRead;
        while (-1 != (bytesRead = bis.read(buff, 0, buff.length))) {
            bos.write(buff, 0, bytesRead);
        }
        bis.close();
        bos.close();

    }

    @Override
    protected void doPost(HttpServletRequest req, HttpServletResponse resp) throws ServletException, IOException {
        // TODO Auto-generated method stub
        doGet(req, resp);
    }
}

结语

首先明确基础知识:InputStream与FileInputStream等都是对内存而言,
那么文件输入流一定是向内存输入流,这对文件下载是有用的。
本质理解下载文件过程:
第一步:就是要下载的文件放到或叫关联到输入流中: 把文件放到内存
new FileInputStream(“d:\test.txt”)
第二步:把输入流转换成输出流,即data从内存放到文件当中去,由此完成了文件下载功能。
YE的IP抓包下载Excel原理 就是利用这种输出流的方式:
InputStream in=new FileInputStream(temp);
outStream(in);
temp.delete();
第三步:再配合以下对浏览器的控制:
response.setContentType(“application/vnd.ms-excel; charset=GBK”);
String fileName=buildTitle()+”.xls”;
response.setHeader(“Content-disposition”,”attachment; filename=”+new String(fileName.getBytes(“GB2312”),”ISO-8859-1”));

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值