Java web文件下载断点续传
发布日期:2021-07-01 01:16:05
浏览次数:2
分类:技术文章
本文共 3547 字,大约阅读时间需要 11 分钟。
一、下载文件请求
@RequestMapping(value = "/file/download") @ResponseBody public 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) { } } }
转载地址:https://maokun.blog.csdn.net/article/details/105468006 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!
发表评论
最新留言
第一次来,支持一个
[***.219.124.196]2024年04月07日 15时26分51秒
关于作者
喝酒易醉,品茶养心,人生如梦,品茶悟道,何以解忧?唯有杜康!
-- 愿君每日到此一游!
推荐文章
调整style中的样式
2019-05-01
如何将本地jar上传至私服
2019-05-01
nat模式和桥接模式使用方法
2019-05-01
nexus简介
2019-05-01
nexus私服搭建(default)
2019-05-01
remote automatically blocked and unavailable
2019-05-01
查看端口占用情况
2019-05-01
nginx(编译安装)-自定义nginx安装路径
2019-05-01
linux系统,启动、停止、重启crontab服务
2019-05-01
Linux下Nginx安装/启动/重启/停止
2019-05-01
Nginx URL重写(rewrite)配置及信息详解
2019-05-01
Nginx rewrite模块深入浅出详解
2019-05-01
mysql 数据库优化配置实例
2019-05-01
crontab定时任务写法
2019-05-01
nginx: [emerg] unknown directive "if($remote_addr" in /usr/local/tools/nginx/conf/nginx.conf:57
2019-05-01
module pip has no attribute main问题解决
2019-05-01