servlet檔案下載例項剖析

露水上的青蛙發表於2017-09-26
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陣列長度最大多少,百度了一下沒有確切的大小,後面測試一下。

相關文章