zoukankan      html  css  js  c++  java
  • servlet文件下载实例剖析

    package mypack;
    
    import java.io.IOException;
    import java.io.InputStream;
    import java.io.OutputStream;
    
    import javax.servlet.http.HttpServlet;
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    
    public class DownloadServlet extends HttpServlet{
        private static final long serialVersionUID = 4024665488257648284L;
        public void doGet(HttpServletRequest request,HttpServletResponse response) {
            OutputStream out = null;
            InputStream in;
            String filename = request.getParameter("filename");
            if(filename == null){
                try {
                    out = response.getOutputStream();
                    out.write("please input filename.".getBytes());
                    out.close();
                    return ;
                } catch (IOException e) {
                    e.printStackTrace();
                }
                
            }
            in = getServletContext().getResourceAsStream("/store/" + filename);
            try {
                int length = in.available();
                response.setContentType("application/force-download");
                response.setHeader("Content-Length", String.valueOf(length));
                response.setHeader("Content-Disposition", "attachment;filename=""+filename+""");
            } catch (IOException e) {
                e.printStackTrace();
            }
            try {
                out = response.getOutputStream();
                int bytesRead = 0;
                byte[] buffer = new byte[512000000];
                while((bytesRead = in.read(buffer)) != -1){
                    out.write(buffer,0,bytesRead);
                }
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            try {
                in.close();
                out.close();
            } catch (IOException e) {
                e.printStackTrace();
            }
            
            
        }
        
    }

    在练习servlet下载例子的时候,刚才报了一个clinetabortException错误。百度了一下说点击取消的时候才有这个错误,可是我明明点击的是下载。

    于是回过头来再次检查代码,发现byte定义的大小有问题于是定义了一个大的,下载1G的压缩文件。

    1. byte

    java中的基本数据类型byte,占用1个字节,8位

    取值范围:0000 0000 ~ 1111 1111 (-128 ~ 127)

    为什么不是:0000 0000 ~ 1111 1111 呢? 

    最高位为符号位,正数的符号位0,负数为1

    1111 1111 表示负数的最大值:-1

    负数的二进制 = 正数(该数的绝对值)的二进制反码 + 1

    例如:-5

    第一步取绝对值:-5 的绝对值:5

    第二步转二进制:5的二进制:0000 0101

    第三步取反码:   0000 0101 的反码 1111 1010

    第四步加一:      1111 1010 加一 1111 1011

    byte数组长度最大多少,百度了一下没有确切的大小,后面测试一下。

  • 相关阅读:
    Android Fragment和FragmentActivity区别和用法
    百度地图
    test
    Activity的跳转与传值
    判断Android应用是否安装、运行
    爬取当当网 Top 500 本五星好评书籍
    TED-WordCloud: 4000+视频标题词云分析
    记第一个爬虫
    requests-html简介
    用requests-html爬取7000+PDF
  • 原文地址:https://www.cnblogs.com/batman425/p/7599479.html
Copyright © 2011-2022 走看看