Java实现断点续传
断点续传原理
原代码如下:
@RestController
@RequestMapping(value = "/howay")
public class FileDownload {
public static final String BASE_DIR = "F:/root/files/";
@CrossOrigin
@RequestMapping(value = "/download",method = {RequestMethod.POST,RequestMethod.GET})
public String downloadFile(HttpServletRequest request,
HttpServletResponse response,
@RequestParam("filename") String fileName) {
System.out.println(request);
String filePath = BASE_DIR+fileName;
if (filePath != null) {
//设置文件路径
File file = new File(filePath);
long lenth = file.length();
int fSize = Integer.parseInt(String.valueOf(file.length()));
long pos = 0;
if (file.exists()) {
response.setContentType("application/force-download");// 设置强制下载不打开
response.setHeader("Accept-Ranges", "bytes");//服务器通知客户端支持断点续传
response.addHeader("Content-Disposition", "attachment;fileName=" + fileName);// 设置文件名
response.setHeader("Content-Length", lenth + "");
if (request.getHeader("Range") != null) {
// 若客户端传来Range,说明之前下载了一部分,设置206状态(SC_PARTIAL_CONTENT)
response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
pos = Long.parseLong(request.getHeader("Range").replaceAll("bytes=", "").replaceAll("-", ""));
}
byte[] buffer = new byte[1];
FileInputStream fis = null;
BufferedInputStream bis = null;
try {
fis = new FileInputStream(file);
bis = new BufferedInputStream(fis);
OutputStream os = response.getOutputStream();
String contentRange = new StringBuffer("bytes ").append(pos+"").append("-").append((fSize - 1)+"").append("/").append(fSize+"").toString();
response.setHeader("Content-Range", contentRange);
bis.skip(pos);
int len = 0;
while ((len=(bis.read(buffer)))!=-1) {
os.write(buffer,0,len);
}
os.flush();
os.close();
return "success";
} catch (Exception e) {
e.printStackTrace();
} finally {
if (bis != null) {
try {
bis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
if (fis != null) {
try {
fis.close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
}
}
return "no found this file,please check file name";
}
}