spring boot断点续传

@GetMapping("/download")
public void download(@RequestParam String path, HttpServletRequest request, HttpServletResponse response) throws IOException {
    Path downloadFile = Paths.get(path);
    if (!Files.exists(downloadFile)) {
        response.setStatus(HttpStatus.NOT_FOUND.value());
        return;
    }
    long fromPos = 0;
    long downloadSize = Files.size(downloadFile);
    if (request.getHeader("Range") != null) {
        response.setStatus(HttpServletResponse.SC_PARTIAL_CONTENT);
        String[] ary = request.getHeader("Range").replaceAll("bytes=", "").split("-");
        fromPos = Long.parseLong(ary[0]);
        downloadSize = (ary.length < 2 ? downloadSize : Long.parseLong(ary[1])) - fromPos;
    }
    response.setContentType(MediaType.APPLICATION_OCTET_STREAM_VALUE);
    response.setContentLengthLong(downloadSize);
    response.setHeader("Content-Disposition", String.format("attachment; filename=\"%s\"", downloadFile.getFileName().toString()));
    response.setHeader("Accept-Ranges", "bytes");
    response.setHeader("Content-Range", String.format("bytes %s-%s/%s", fromPos, (fromPos + downloadSize), Files.size(downloadFile)));

    try (FileChannel inChannel = FileChannel.open(downloadFile);
         WritableByteChannel outChannel = Channels.newChannel(response.getOutputStream())) {
        while (downloadSize > 0) {
            long count = inChannel.transferTo(fromPos, downloadSize, outChannel);
            if (count > 0) {
                fromPos += count;
                downloadSize -= count;
            }
        }

    }
}
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值