Http文件下载的普通模式就不多说了,断点下载与普通模式不一样的是,断点下载的头信息里面增加了一个属性
RANGE: bytes=100000-
这里RANGE代表客户端要从那个位置开始下载
而服务器返回时和普通模式不同的是:
1:多了一个属性
Content-Range=bytes 100000-19999/20000
注意还有一些属性要设置,和普通模式一样,例如Content-Length属性
2:返回码为206
java代码:
@SuppressWarnings({ "unchecked" })
@RequestMapping(value = "/downOdex.do")
public ResponseEntity<String> 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);
<span style="font-family: Consolas;">Thread.sleep(</span><code class=
"java value">100</code><code class="java plain">);</code>
}
} 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跳过不需要读的文件,和注意关闭流。
摘自:您到ITEYE网站看 java小强 原创,谢谢!
http://cuisuqiang.iteye.com/!