天天看點

java 斷點下載下傳_Http斷點下載下傳實簡單講解

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沒多大關系,是以你可以很容易的應用到你的項目中。

使用浏覽器自帶的下載下傳工具進行下載下傳,這樣可以控制下載下傳和暫停,來觀察斷點下載下傳的過程。

java 斷點下載下傳_Http斷點下載下傳實簡單講解

點選暫停會看到下載下傳暫停下來

java 斷點下載下傳_Http斷點下載下傳實簡單講解

可以選擇繼續下載下傳。

過程中你會看到,用戶端不會馬上把檔案下載下傳下來,而是慢慢下載下傳,就是因為我在程式中增加了停頓來檢視這個下載下傳過程

Thread.sleep(100);

然後我們的緩沖區是

byte[] buffer = new byte[1024*10];

是以,每秒的速度就是100KB理論速度,因為是本地,是以接近100KB每秒。