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陣列長度最大多少,百度了一下沒有確切的大小,後面測試一下。