Http檔案下載下傳的普通模式就不多說了,斷點下載下傳與普通模式不一樣的是,斷點下載下傳的頭資訊裡面增加了一個屬性
RANGE: bytes=100000-
這裡RANGE代表用戶端要從那個位置開始下載下傳
而伺服器傳回時和普通模式不同的是:
1:多了一個屬性
Content-Range=bytes 100000-19999/20000
注意還有一些屬性要設定,和普通模式一樣,例如Content-Length屬性
2:傳回碼為206
然後我們來看一段實際應用中的斷點下載下傳代碼,注意這裡我使用的是SpringMVC模式開發的:
@SuppressWarnings({ "unchecked" })
@RequestMapping(value = "/downOdex.do")
public ResponseEntity downFile(
@RequestParam(value="odexName")String odexName,
HttpServletResponse response,
HttpServletRequest request){
InputStream inputStream = null;
ServletOutputStream out = null;
try {
File file = new File(OdexManage.odexFileBasePath + "\\" + odexName);
int fSize = Integer.parseInt(String.valueOf(file.length()));
response.setCharacterEncoding("utf-8");
response.setContentType("application/x-download");
response.setHeader("Accept-Ranges", "bytes");
response.setHeader("Content-Length", String.valueOf(fSize));
response.setHeader("Content-Disposition", "attachment;fileName=" + odexName);
inputStream=new FileInputStream(OdexManage.odexFileBasePath + "\\" + odexName);
long pos = 0;
if (null != request.getHeader("Range")) {
// 斷點續傳
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
try {
pos = Long.parseLong(request.getHeader("Range").replaceAll("bytes=", "").replaceAll("-", ""));
} catch (NumberFormatException e) {
pos = 0;
}
}
out = response.getOutputStream();
String contentRange = new StringBuffer("bytes ").append(pos+"").append("-").append((fSize - 1)+"").append("/").append(fSize+"").toString();
response.setHeader("Content-Range", contentRange);
inputStream.skip(pos);
byte[] buffer = new byte[1024*10];
int length = 0;
while ((length = inputStream.read(buffer, 0, buffer.length)) != -1) {
out.write(buffer, 0, length);
Thread.sleep(100);
}
} catch (Exception e) {
logger.error("ODEX軟體下載下傳異常:"+e);
}finally{
try {
if(null != out) out.flush();
if(null != out) out.close();
if(null != inputStream) inputStream.close();
} catch (IOException e) {
}
}
return new ResponseEntity(null,HttpStatus.OK);
}
其重點在于HTTP協定裡面屬性有一些不同的地方,還有就是InputStream跳過不需要讀的檔案,和注意關閉流。
通過核心代碼也可以看到,其實這和是不是SpringMVC沒多大關系,是以你可以很容易的應用到你的項目中。
使用浏覽器自帶的下載下傳工具進行下載下傳,這樣可以控制下載下傳和暫停,來觀察斷點下載下傳的過程。
![](https://img.laitimes.com/img/__Qf2AjLwojIjJCLyojI0JCLicmbw5CZ5cTZjJjNkVWM5QDM4MTNwYWOhBTZjJTN2YmYmBDO48CX0JXZ252bj91Ztl2Lc52YucWbp5GZzNmLn9Gbi1yZtl2Lc9CX6MHc0RHaiojIsJye.png)
點選暫停會看到下載下傳暫停下來
可以選擇繼續下載下傳。
過程中你會看到,用戶端不會馬上把檔案下載下傳下來,而是慢慢下載下傳,就是因為我在程式中增加了停頓來檢視這個下載下傳過程
Thread.sleep(100);
然後我們的緩沖區是
byte[] buffer = new byte[1024*10];
是以,每秒的速度就是100KB理論速度,因為是本地,是以接近100KB每秒。