首页 > 其他分享 >SpringMVC WEB项目文件夹上传下载解决方案

SpringMVC WEB项目文件夹上传下载解决方案

时间:2023-03-14 16:11:42浏览次数:64  
标签:WEB 字节 文件 SpringMVC 上传下载 bytes Range 下载 请求


 

 

一、概述

 

所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的HTTP协议是不支持断点的,HTTP/1.1开始就支持了。一般断点下载时才用到Range和Content-Range实体头。HTTP协议本身不支持断点上传,需要自己实现。

 

二、Range 

 

用于请求头中,指定第一个字节的位置和最后一个字节的位置,一般格式:

 

    Range:用于客户端到服务端的请求,可以通过改字段指定下载文件的某一段大小及其单位,字节偏移从0开始。典型格式:

    Ranges:    (unit=first byte pos)-[last byte pos]

    Ranges:    bytes=4000- 下载从第4000字节开始到文件结束部分

    Ranges:    bytes=0~N 下载第0-N字节范围的内容

    Ranges:    bytes=M-N 下载第M-N字节范围的内容

    Ranges:    bytes=-N 下载最后N字节内容


 

 

1.以下几点需要注意:

(1)这个数据区间是个闭合区间,起始值是0,所以“Range: bytes=0-1”这样一个请求实际上是在请求开头的2个字节。

(2)“Range: bytes=-200”,它不是表示请求文件开始位置的201个字节,而是表示要请求文件结尾处的200个字节。

(3)如果last byte pos小于first byte pos,那么这个Range请求就是无效请求,server需要忽略这个Range请求,然后回应一个200,把整个文件发给client。

(4)如果last byte pos大于等于文件长度,那么这个Range请求被认为是不能满足的,server需要回应一个416,Requested range not satisfiable。

 

2.示例解释:

表示头500个字节:bytes=0-499  

表示第二个500字节:bytes=500-999  

表示最后500个字节:bytes=-500  

表示500字节以后的范围:bytes=500-  

第一个和最后一个字节:bytes=0-0,-1  

同时指定几个范围:bytes=500-600,601-999 

 

三、Content-Range

 

用于响应头,指定整个实体中的一部分的插入位置,他也指示了整个实体的长度。在服务器向客户返回一个部分响应,它必须描述响应覆盖的范围和整个实体长度。一般格式: 

 

Content-Range: bytes (unit first byte pos) - [last byte pos]/[entity legth] 

 

四、Header示例

 

请求下载整个文件: 

 

GET /test.rar HTTP/1.1 

Connection: close 

Host: 116.1.219.219 

Range: bytes=0-801 //一般请求下载整个文件是bytes=0- 或不用这个头

 

一般正常回应 

 

HTTP/1.1 200 OK 

Content-Length: 801      

Content-Type: application/octet-stream 

Content-Range: bytes 0-800/801 //801:文件总大小

 

一个最简单的断点续传实现大概如下:

1.客户端下载一个1024K的文件,已经下载了其中512K

2. 网络中断,客户端请求续传,因此需要在HTTP头中申明本次需要续传的片段:

Range:bytes=512000-

这个头通知服务端从文件的512K位置开始传输文件

3. 服务端收到断点续传请求,从文件的512K位置开始传输,并且在HTTP头中增加:

Content-Range:bytes 512000-/1024000

并且此时服务端返回的HTTP状态码应该是206,而不是200。

但是在实际场景中,会出现一种情况,即在终端发起续传请求时,URL对应的文件内容在服务端已经发生变化,此时续传的数据肯定是错误的。如何解决这个问题了?显然此时我们需要有一个标识文件唯一性的方法。在RFC2616中也有相应的定义,比如实现Last-Modified来标识文件的最后修改时间,这样即可判断出续传文件时是否已经发生过改动。同时RFC2616中还定义有一个ETag的头,可以使用ETag头来放置文件的唯一标识,比如文件的MD5值。

终端在发起续传请求时应该在HTTP头中申明If-Match 或者If-Modified-Since 字段,帮助服务端判别文件变化。

另外RFC2616中同时定义有一个If-Range头,终端如果在续传是使用If-Range。If-Range中的内容可以为最初收到的ETag头或者是Last-Modfied中的最后修改时候。服务端在收到续传请求时,通过If-Range中的内容进行校验,校验一致时返回206的续传回应,不一致时服务端则返回200回应,回应的内容为新的文件的全部数据。

asp.net源码下载jsp-springboot源码下载jsp-eclipse源码下载jsp-myeclipse源码下载php源码下载csharp-winform源码下载vue-cli源码下载c++源码下载

详细配置信息及思路

标签:WEB,字节,文件,SpringMVC,上传下载,bytes,Range,下载,请求
From: https://www.cnblogs.com/songsu/p/17215285.html

相关文章

  • Web信息收集
    Web信息收集目录Web信息收集1、whois查询2、服务器操作系统的识别3、服务器加固4、服务版本识别5、常见组合:6、指纹识别7、敏感路径识别8、历史漏洞信息收集1、whois查询......
  • Burp Suite Professional 2023.3 (macOS, Linux, Windows) - Web 应用安全、测试和扫
    BurpSuiteProfessional,Test,find,andexploitvulnerabilities.请访问原文链接:https://sysin.org/blog/burp-suite-pro-2023/,查看最新版。原创作品,转载请保留出处。......
  • PHP WEB项目文件夹上传下载解决方案
    一、功能性需求与非功能性需求要求操作便利,一次选择多个文件和文件夹进行上传;支持PC端全平台操作系统,Windows,Linux,Mac支持文件和文件夹的批量下载,断点续传。刷新页面......
  • NAS通过Alist挂载公共云盘并用WebDAV本地加载的注意事项
    前言NAS采用Dock的方法,用Alist程序挂载阿里云盘后通过WebDAV加载使用,是一个很实用的需求,很好的实现了云端存储本地管理。关于NAS通过Alist挂载公共云盘,网上有很成熟的贴......
  • dirsearch web网站目录扫描工具详解
    文章目录​​1dirsearch介绍​​​​2安装​​​​3实战演练​​​​3.1仅指定网址-u​​​​3.2指定网站语言-e​​​​3.3指定字典-w​​​​3.4递归目录-r​......
  • Webpack底层原理及核心概念实际应用(一篇封神系列)
    Webpack是一个流行的打包工具,用于构建大型前端项目。它在前端社区中广泛使用,并且已成为前端开发中必不可少的工具之一。本篇文章将对Webpack的工作原理进行深入讲解并附带代......
  • Nginx:轻松搭建高性能Web服务的必备利器
    一、Nginx简介1.1Nginx的特点和优点高性能:Nginx采用了事件驱动、异步非阻塞的处理方式,可以处理大量并发连接请求,同时减少服务器资源的占用。它的吞吐量比传统的Web服务器高......
  • webgl 城市扫光
    需求:1.城市建筑物渐变2.中心光圈扩散3.水平面横扫直线4.抛物线聚合 先看效果     在上代码  /**@Author:marui*@Date:2023-03-0909:42:......
  • WebGIS|阿里云服务器配置Geoserver并发布服务
    前期准备购买阿里云的ECS服务器,创建实例,进入实例概述,查看这个实例的基本情况,这里我的实例的操作系统为系统为Ubuntu20.04。内存为4G,这里要注意的是公网IP,这时之后我们访......
  • WebGIS|OpenLayers加载Geoserver发布的图层数据
    OpenLayers加载WMS服务总的来说有两种方式:ol.layer.Image+ol.source.ImageWMS和ol.layer.Tile+ol.source+TileWMS这两种方式加载都需要设定bounds(bbox)和projection。openl......