java实现断点续传

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";

    }

   

   

 

}

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值