首页 > 编程语言 >PHP Web实现文件上传下载功能实例解析

PHP Web实现文件上传下载功能实例解析

时间:2023-04-20 11:13:01浏览次数:45  
标签:Web 字节 文件 上传下载 bytes Range PHP 下载 请求

 一、概述

 

所谓断点续传,其实只是指下载,也就是要从文件已经下载的地方开始继续下载。在以前版本的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,字节,文件,上传下载,bytes,Range,PHP,下载,请求
From: https://www.cnblogs.com/songsu/p/17336070.html

相关文章

  • Web 下载文件名乱码解决以及多浏览器兼容方案
    在web开发中,经常我们会遇到如导出或者下载网页这种需求,但是往往会遇到在chrome浏览器下载的文件名正常,但是到firefox,Safari上却乱码的情况,经过网上的资料多次研究,最终总结出了如下的方法,代码如下:///<summary>///浏览器下载文件,完整文件下载,不支持分片下载,为了兼容safari,下......
  • 手把手逐步解析Javaweb登录实例
    一、编写前端界面<!DOCTYPEhtml><htmllang="en"><head><metacharset="UTF-8"><metaname="viewport"content="width=device-width,initial-scale=1.0"><title>Document</titl......
  • php imagick实现文字渐变
     参考文档: https://fengkui.net/articles/117 //实现css background:linear-gradient(-66deg,rgba(222,162,79,0.9)0%,rgba(255,236,161,0.94)39.74609375%,#DEA24F100%);publicfunctiondrawPrice($priceText){//创建新的画布对象和透......
  • webgl 系列 —— 着色器语言
    其他章节请看:webgl系列着色器语言本篇开始学习着色器语言——GLSL全称是GraphicsLibraryShaderLanguage(图形库着色器语言)GLSL是一门独立的语言,和其他语言一样有自己的变量、运算符、函数、循环(for)、控制语句(if)、函数、数组等等。GLSL比较简单。其专门用于编写着色器,舍......
  • 如何在 .NET Core WebApi 中处理 MultipartFormDataContent
    最近在对某个后端服务做.NETCore升级时,里面使用了多处处理MultipartFormDataContent相关内容的代码。这些地方从.NETFramework迁移到.NETCore之后的代码改动较大,由于本身没有测试覆盖,导致在部署QA环境后引发了一些问题。这里做一个技术复盘。什么是MultipartForm......
  • 分享下之前做的STM32嵌入式Web完整设计教程和案例html,Ajax,Javacript,XML,cgi等
    这段时间好些网友咨询,特此再分享下:http://www.armbbs.cn/forum.php?mod=viewthread&tid=26034如果需要外网也可以访问,此贴:【专题教程第3期】开发板搭建Web服务器,利用花生壳让电脑和手机可以外网远程监控,手机4G访问域名效果:   微信公众号:armfly_com......
  • web页面播放spine动画及播放相关使用及总结spine-player.js
    1.官方git,里面有些例子可以参考。https://github.com/EsotericSoftware/spine-runtimes.git2.官方播放器:http://zh.esotericsoftware.com/spine-player目前测试4.0以上的js支持动画模型透明3.最基本的资源初始化html代码里面:<divid="player-container"style="width:640......
  • thinkphp
    ThinkPHP是一个开源的PHP框架,是为了简化企业级应用开发和敏捷WEB应用开发而诞生的。最早诞生于2006年初,原名FCS,2007年元旦正式更名为ThinkPHP,并且遵循Apache2开源协议发布。早期的思想架构来源于Struts,后来经过不断改进和完善,同时也借鉴了国外很多优秀的框架和模式,使用面向对象的开......
  • web前端
    工程认知——Web前端Week1一、课程概要、要求和学习方法概要:本课程将系统地学习现代软件前端开发的实用技术,在前端技术中属于中级实用技术范畴。课程包含前端三大部分HTML5、CSS3、JavaScript、前端框架和后端框架,循序渐进地将每一部分的实用技术结合讲解、演示,最后交予学生不......
  • Python常用的web开发工具,你了解多少?
    Python作为一门高级的编程语言,其在web开发领域有着十分优异的表现,自带众多Pythonweb开发应用框架,利用它们你可以轻松构建高端web应用程序。本文为大家盘点Python常用的web开发工具,快来看看你了解多少!1.CubicWebCubicWeb的最重要的支柱就是代码的可重用性。CubicWeb......