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数组长度最大多少,百度了一下没有确切的大小,后面测试一下。

转载于:https://www.cnblogs.com/batman425/p/7599479.html

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值