一、下载文件请求
@RequestMapping(value = "/file/download")@ResponseBodypublic Res download(HttpServletRequest request, HttpServletResponse response) {File file = new File(request.getParameter("fileName"));if (file.exists()) {String range = request.getHeader("Range");if (range != null && (range = range.trim()).length() > 0) {Pattern rangePattern = Pattern.compile("^bytes=([0-9]+)-([0-9]+)?$");Matcher matcher = rangePattern.matcher(range);if (matcher.find()) {Integer start = Integer.valueOf(matcher.group(1));Integer end = 0;String endStr = matcher.group(2);if (endStr != null && (endStr = endStr.trim()).length() > 0)end = Integer.valueOf(endStr);downLoadByBreakpoint(file, start, end, response);return null;}}downLoadAll(file, response);return null;}return Res.fail("文件不存在");}
二、断点下载
public void downLoadByBreakpoint(File file, long start, long end, HttpServletResponse response){OutputStream stream = null;RandomAccessFile fif = null;try {if (end <= 0) {end = file.length() - 1;}stream = response.getOutputStream();response.reset();response.setStatus(206);response.setContentType("application/octet-stream");response.setHeader("Content-disposition", "attachment; filename=" + file.getName());response.setHeader("Content-Length", String.valueOf(end - start + 1));response.setHeader("Accept-Ranges", "bytes");response.setHeader("Content-Range", String.format("bytes %s-%s/%s", start, end, file.length()));fif = new RandomAccessFile(file, "r");fif.seek(start);long index = start;int d;byte[] buf = new byte[10240];while (index <= end && (d = fif.read(buf)) != -1) {if (index + d > end) {d = (int)(end - index + 1);}index += d;stream.write(buf, 0, d);}stream.flush();} catch (Exception e) {try {if (stream != null)stream.close();if (fif != null)fif.close();} catch (Exception e11) {}}}
三、普通全量下载
public void downLoadAll(File file, HttpServletResponse response){OutputStream stream = null;BufferedInputStream fif = null;try {stream = response.getOutputStream();response.reset();response.setContentType("application/octet-stream");response.setHeader("Content-disposition", "attachment; filename=" + file.getName());response.setHeader("Content-Length", String.valueOf(file.length()));fif = new BufferedInputStream(new FileInputStream(file));int d;byte[] buf = new byte[10240];while ((d = fif.read(buf)) != -1) {stream.write(buf, 0, d);}stream.flush();} catch (Exception e) {try {if (stream != null)stream.close();if (fif != null)fif.close();} catch (Exception e11) {}}}