当前位置:首页 > 生态圈 > 正文内容

java文件下载断点续传(java实现断点下载)

abcsky883个月前 (02-08)生态圈92

今天给各位分享

前言❝互联网的连接速度慢且不稳定,有可能由于网络故障导致断开连接。在客户端下载一个大对象时,因网络断开导致上传下载失败的概率就会变得不可忽视。❞

java文件下载断点续传(java实现断点下载)

客户端在GET对象请求时通过设置Range头部来告诉接口服务需要从什么位置开始输出对象的数据判断是否支持断点下载,根据文档:14.35.1 Byte Rangeshttps://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html。

// 直接判断是否有 Accept-Ranges = bytesboolean support = urlConnection.getHeaderField("Acceseo综合查询怎么用pt-Ranges").equals(

"bytes");System.out.println("Partial content retrieval support = " + (support ? "Yes" : "No));例如:donald

@donald-pro:~$ curl -i --range 0-9 http://localhost:8080/file/chunk/downloadHTTP/1.1206Accept-Ranges: bytes

Content-Disposition: inline;filename=pom.xmlContent-Range: bytes 0-9/13seo综合查询怎么用485Content-Length: 10Date: Mon,

01 Nov 202109:53:25 GMT直接判断头部HEAD,例如:❝HeadObject接口用于获取某个文件(Object)的元信息使用此接口不会返回文件内容❞HEAD /ObjectName HTTP/。

1.1Host: BucketName.oss-cn-hangzhou.aliyuncs.comDate: GMT DateAuthorization: SignatureValue需知,对应HTTP状态码:

206 Partial Content:HTTP Range请求成功416 Requested Range Not seo综合查询怎么用Satisfiable status:HTTP Range请求超出界限200 OK:不支持范围请求

小结如下:HTTP范围请求:需要HTTP/1.1及之上支持,如果双端某一段低于此版本,则认为不支持通过响应头中的Accept-Ranges来确定是否支持范围请求通过在请求头中添加Range这个请求头,来指定请求的内容实体的字节范围。

在响应头中,通过Content-Range来标识当前返回的内容实体范围,并使用 Content-Length 来标识当前返回的内容实体范围长度在请求过程中,可以通过If-Range来区分资源文件是否变动,它的值来自。

ETag或者Last-Modifled如果资源文件有改seo综合查询怎么用动,会重新走下载流程生产实战开发也得依靠依据,设定好边界,才能掌控全局有现成的文档,来看阿里云文档https://help.aliyun.com/document_detail/39571.html。

Range: bytes=0-499:表示第0~499字节范围的内容Range: bytes=500-999:表示第500~999字节范围的内容Range: bytes=-500:表示最后500字节的内容。

Range: bytes=500-:表示从第500字节开始到文件结束部分的内容Range: bytes=0-:表示第一个字节到最后一个字节,即完整的文件内容HTTP Range是否合法对应处理:seo综合查询怎么用如果HTTP Range

请求合法,响应返回值为 206 并在响应头中包含Content-Range如果HTTP Range请求不合法,或者指定范围不在有效区间,会导致Range不生效,响应返回值为200,并传送整个Object

内容❝如下为HTTP Range请求不合法的示例及错误说明: 假设Object资源大小为1000字节,Range有效区间为0~999Range: byte=0-499:格式错误,byte应为bytesRange: bytes=0-1000

:末字节1000超出有效区间Range: bytes=1000-2000:指定范围超出有效区间Range: bytes=1000-:首字seo综合查询怎么用节超出有效区间Range: bytes=-2000:指定范围超出有效区间。

❞举一些栗子:> 基于 Spring Cloud Alibaba + Gateway + Nacos + RocketMQ + Vue & Element 实现的后台管理系统 + 用户小程序,支持 RBAC 动态权限、多租户、数据权限、工作流、三方登录、支付、短信、商城等功能

>> * 项目地址:> * 视频教程:# 正常范围下载donald

@donald-pro:~$ curl -i --range 0-9 http://localhost:8080/file/chunk/downloadHTTP/1.1206Accepseo综合查询怎么用t-Ranges: bytes

Content-Disposition: inline;filename=Screen_Recording_20211101-162729_Settings.mp4Content-Range: bytes 

0-9Content-Type: application/force-download;charset=UTF-8Content-Length: 16241985Date: Wed, 03 Nov 2021

09:50:50 GMT服务端 - 业务开发这里以SpringBoot为栗子:对外支持range下载底层存储:使用cephController如下:@Slf4jseo综合查询怎么用@RestControllerpublic

classController{@Autowiredprivate FileService fileService;/**     * 下载文件     *     * 对外提供     *     * 

@param fileId 文件Id     * @param token token     * @param accountId 帐号Id     * @param response 响应     */

@GetMapping("/oceanfile/download")publicvoiddownloadOceanfile(@RequestParamseo综合查询怎么用 String fileId,                                  @RequestHeader(value =

"Range") String range,                                  HttpServletResponse response) {this.fileService.downloadFile(fileId, response, range);

}}Service如下:@Slf4j@ServicepublicclassFileService{@Autowiredprivate CephUtils cephUtils;seo综合查询怎么用/**     * 直接下载文件

     *     * Tips: 支持断点下载     * @param fileId 文件Id     * @param response 返回     * @param range 范围     */

publicvoiddownloadFile(String fileId, HttpServletResponse response, String range){// 根据 fileId 获取文件信息

FileInfo fileInfo = getFileInfo(fileId);        String bucketName = fileInfo.getBuckseo综合查询怎么用etName();

        String relativePath = fileInfo.getRelativePath();// 处理 range,范围信息        RangeDTO rangeInfo = executeRangeInfo(range, fileInfo.getFileSize());

// rangeInfo = null,直接下载整个文件if (Objects.isNull(rangeInfo)) {            cephUtils.downloadFile(response, bucketName, relativePath);

return;        }//seo综合查询怎么用 下载部分文件        cephUtils.downloadFileWithRange(response, bucketName, relativePath, rangeInfo);

    }private RangeDTO executeRangeInfo(String range, Long fileSize){if (StringUtils.isEmpty(range) || !range.contains(

"bytes=") || !range.contains("-")) {returnnull;        }long startByte = 0;long endByte = fiseo综合查询怎么用leSize -

1;        range = range.substring(range.lastIndexOf("=") + 1).trim();        String[] ranges = range.split(

"-");if (ranges.length  2) {returnnull;        }try {if (ranges.length == 1) {

if (range.startsWith("-")) {//1. 如:bytes=-1024  从开始字节到第1024个字节的数据                    endByte = Long.parseLoseo综合查询怎么用ng(ranges[

0]);                } elseif (range.endsWith("-")) {//2. 如:bytes=1024-  第1024个字节到最后字节的数据                    startByte = Long.parseLong(ranges[

0]);                }            } else {//3. 如:bytes=1024-2048  第1024个字节到2048个字节的数据                startByte = Long.parseLong(ranges[

0]);          seo综合查询怎么用      endByte = Long.parseLong(ranges[1]);            }        } catch (NumberFormatException e) {

            startByte = 0;            endByte = fileSize - 1;        }if (startByte >= fileSize) {            log.error(

"range error, startByte >= fileSize. " +"startByte: {}, fileSize: {}", startByte, fileSize);reseo综合查询怎么用turnnull

;        }returnnew RangeDTO(startByte, endByte);    }}以上内容,大家可以收藏起来,如果以后遇到这样的场景,分分钟搞定!作者:格格步入来源:https://juejin.cn/post/7026372482110079012

往期推荐1、互联网“P7/P8”泡沫,破灭了2、AI照骗恐怖如斯!美女刷屏真假难辨,网友:AI网恋诈骗时代开启3、程序员,当与同事发生冲突怎么办?4、普通人如何用ChatGPT搞钱?5、Java之父偏爱函数式编程,称自己的代码风格被队友批评

点分享

点收藏

点点赞

点在看

扫描二维码推送至手机访问。

版权声明:本文由海南拓宏网络科技工作室发布,如需转载请注明出处。

本文链接:http://4blc.com/post/15826.html

分享给朋友:

“java文件下载断点续传(java实现断点下载)” 的相关文章

应届生进字节跳动(字节跳动应届生要求)

本文分享给大家的是: 张小方推荐:很多人选择了计算机这个行业,为了提高自己的薪资收入可谓煞费苦心,但是结果差强人意,其实基础知识扎实的人,拿薪资还是不难的本文分享了一位应届校招生拿 40W 年薪今日头条的 offer 的经历,其面试的内容虽然不难,但是非常基础,不踏实的人一定答不好...

程序员算法刷题(程序员做题的网站)

今天给各位分享 原标题:八个程序员必备刷题网站,让你轻松拿offer1、leetcodeleetcode中文名为力扣,是一个为全球程序员提供 IT 技术职业化提升的平台,提供了完善的在线判题服务、学习工具、社区讨论及模拟面试功能,全方位打磨程序员职业所需的核心技能。 力扣为...

java面试进阶指南(java面试题怎么准备)

本篇文章给大家谈谈 面试其实分为两部分,第一是Java知识点,主要是主流开发框架,开发技术。第二是招聘方的业务情况。 技术方面:技术方面的问题包含Java基础、框架等,特别是Java的一些核心基础知识点、对源码解读和核心原理的理解都是加分项大厂面试Java程序员的基本原则就...

java跟大数据哪个比较好学(javaee和大数据的区别)

本文分享给大家的是: 点击上方蓝字关注,更多惊喜等着你 哈喽艾维巴蒂又是准时上线的博酱提起Java或大数据很多人对此都一目了然但是Java大数据这个新鲜名词不知道大家有没有疑惑呢 Java和Java大数据学习的内容是一样的吗?两者有什么区别呢?今天博酱就从Java和...

雏田是每一个男生(说女生像雏田)

本文分享给大家的是: 原标题:男生说我像雏田是什么意思啊,没看过火影,求解?男生说我像雏田是什么意思啊,没看过火影,求解?在热血动漫《火影忍者》中,相较于活泼而富有朝气的春野樱、毒舌的山中井野,日向雏田拥有两个明显的特征其中一个是性格含蓄、害羞,在木叶村十二小强中,日向雏田或许是继...

21世纪是计算机的世纪(21世纪是什么技术)

本篇文章给大家谈谈  IT 圈有一个悬了很多年未决的世界谜题:“Java 到底什么时候会死啊?” 今年以来,一些比较流行的语言都呈现出稳定下降的趋势,像 Java 和 C 语言就是其中的大代表。 Java 屡“被死亡”?C 语言一蹶不振?过去 16 年来...