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 如侵犯您的版权,请留言回复原文章的地址,我们会给您删除此文章,给您带来不便请您谅解!

上一篇:Spring @Import注解配置类方法内部调用没有注入属性值的坑
下一篇:SpringBoot2.1.9 Mybatis由于@Mapper注解多数据源配置不生效问题

发表评论

最新留言

第一次来,支持一个
[***.219.124.196]2024年04月07日 15时26分51秒