深入理解文件上传下载的原理及实现逻辑2

文件上传的是根据 http 协议的规范和定义,完成请求消息体的封装和消息体的解析,然后将二进制内容保存到文件。在上传一个文件时,需要把 form 标签的enctype设置为multipart/form-data,同时method必须为post方法

multipart/form-data结构:

展开

代码语言:Bash

自动换行

AI代码解释

# 请求标头 Content-Type: multipart/form-data; boundary=----webKitFormBoundaryDCntfiXcSkPhS4PN origin: https://convertio.co referer: https://convertio.co/ # From data ----WebKitFormBoundaryDCntfiXcSkPhS4PN content-Disposition: form-data; name="f1"; filename="test.gif"Content-Type: image/gif ----WebKitFormBoundaryDCntfiXcSkPhS4PN

(1)请求头(注意这里的请求头并不是指http header):Content-Type: multipart/form-data; boundary=----WebKitFormBoundaryDCntfiXcSkPhS4PN 表示本次请求要上传文件,其中 boundary 表示分隔符,如果要上传多个表单项,就要使用 boundary 分割,每个表单项由----XXX 开始,以----XXX 结尾。

(2)消息体- Form Data 部分:每一个表单项又由Content-Type和Content-Disposition组成。Content-Disposition: form-data 为固定值,表示一个表单元素,name 表示表单元素的 名称,回车换行后面就是name的值,如果是上传文件就是文件的二进制内容。Content-Type:表示当前的内容的 MIME 类型,是图片还是文本还是二进制数据。

1.2、服务器解析

客户端发送请求到服务器后,服务器会收到请求的消息体,然后对消息体进行解析,解析出哪是普通表单哪些是附件。

二、文件上传类型

2.1、秒传

(1)概念:通俗的说,把要上传的东西上传,服务器会先做MD5校验,如果服务器上有一样的东西,它就直接给个新地址,引用计数加一;其实下载的都是服务器上的同一个文件,想要不秒传,其实只要让MD5改变,就是对文件本身做一下修改(改名字不行),例如一个文本文件,多加几个字,MD5就变了,就不会秒传了。

(2)秒传核心逻辑:

  1. 利用redis的set方法存放文件上传状态,其中key为文件上传的md5,value为是否上传完成的标志位。

  2. 当标志位true为上传已经完成,此时如果有相同文件上传,则进入秒传逻辑。如果标志位为false,则说明还没上传完成,此时需要在调用set的方法,保存块号文件记录的路径,其中key为上传文件md5加一个固定前缀,value为块号文件记录路径。

2.2、分片上传

(1)概念:分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(称之为Part)来进行分别上传,上传完之后再由服务端对所有上传的文件进行汇总整合成原始的文件。

(2)分片上传的场景:

  1. 大文件上传。

  2. 网络环境环境不好,存在需要重传风险的场景。

2.3、大文件上传

大文件上传一般采用分片上传的方式,这样可以提高文件上传的速度,前端拿到文件流后进行分片,然后与后端进行通讯传输,一般还会结合断点继传,这时后端一般提供三个接口:

  1. 第一个接口获取已经上传的分片信息。

  2. 第二个接口将前端分片文件进行传输。

  3. 第三个接口是将所有分片上传完成后告诉后端进行文件合并。

2.4、断点续传

(1)概念:断点续传是在下载或上传时,将下载或上传任务(一个文件或一个压缩包)人为的划分为几个部分,每一个部分采用一个线程进行上传或下载,如果碰到网络故障,可以从已经上传或下载的部分开始继续上传或者下载未完成的部分,而没有必要从头开始上传或者下载。

(2)应用场景:断点续传可以看成是分片上传的一个衍生,因此可以使用分片上传的场景,都可以使用断点续传。

(3)实现断点续传的核心逻辑:在分片上传的过程中,如果因为系统崩溃或者网络中断等异常因素导致上传中断,这时候客户端需要记录上传的进度。在之后支持再次上传时,可以继续从上次上传中断的地方进行继续上传。为了避免客户端在上传之后的进度数据被删除而导致重新开始从头上传的问题,服务端也可以提供相应的接口便于客户端对已经上传的分片数据进行查询,从而使客户端知道已经上传的分片数据,从而从下一个分片数据开始继续上传。

(4)实现流程步骤:方案一(检测分片的方式):

  1. 将需要上传的文件按照一定的分割规则,分割成相同大小的数据块;

  2. 初始化一个分片上传任务,返回本次分片上传唯一标识;

  3. 按照一定的策略(串行或并行)发送各个分片数据块;

  4. 发送完成后,服务端根据判断数据上传是否完整,如果完整,则进行数据块合成得到原始文件。

方案二(检测文件大小的方式):

  1. 前端(客户端)需要根据固定大小对文件进行分片,请求后端(服务端)时要带上分片序号和大小。

  2. 服务端创建conf文件用来记录分块位置,conf文件长度为总分片数,每上传一个分块即向conf文件中写入一个127,那么没上传的位置就是默认的0,已上传的就是Byte.MAX_VALUE 127(这步是实现断点续传和秒传的核心步骤)。

  3. 服务器按照请求数据中给的分片序号和每片分块大小(分片大小是固定且一样的)算出开始位置,与读取到的文件片段数据,写入文件。

三、断点下载原理

  1. 获取服务器文件的大小;

  2. 发起下载请求,包含下载范围。比如总文件大小为1024,已经下载了238,要下载的范围就是239~1024;服务器按照请求的范围发送给客户端。

获取文件大小:如果使用curl开源库,可以通过curl_easy_getinfo(curl, CURLINFO_CONTENT_LENGTH_DOWNLOAD,&size)获取文件的大小。

四、多线程下载逻辑

  1. 先获取文件大小。

  2. 根据线程数量划分每个线程要下载的文件长度;不能整除则采用向上取整。

  3. 每个线程下载对应的区域块。

  4. 顺序合并文件;写入时候加锁,lseek到对应位置,然后写入数据。

一般,顺序合并文件是要先等前面序号的下载完,后面序号(比前面序号的先下载完)的才会整合进来。多线程下载要不要临时文件,依赖于业务要求,如果是大文件的最好有临时文件,减少内存占用。

五、总结

本文全面介绍了文件上传下载的原理和实现逻辑。首先学习了文件上传的基本原理,包括HTTP请求格式和服务器解析过程。然后深入探讨了不同类型的文件上传,如秒传、分片上传、大文件上传和断点续传。对于文件下载,解释了断点下载的原理,并介绍了多线程下载的逻辑。

通过本文的学习,对文件上传下载有了更深入的了解。了解了文件上传的工作原理,以及不同类型的文件上传方式的特点和应用场景。对于文件下载,学习了断点下载的原理和多线程下载的逻辑。这些知识可以帮助更好地应用和优化文件传输功能,提高系统性能和用户体验。

.dongchedi.com/article/7594153502142890521
www.dongchedi.com/article/7594151998267032089
www.dongchedi.com/article/7594154986410738201
www.dongchedi.com/article/7594153635873882649
www.dongchedi.com/article/7594154845427827225
www.dongchedi.com/article/7594151436733514264
www.dongchedi.com/article/7594148355094708761
www.dongchedi.com/article/7594143059890602558
www.dongchedi.com/article/7594142952818426392
www.dongchedi.com/article/7594142964432323096
www.dongchedi.com/article/7594143059890209342
www.dongchedi.com/article/7594143001568707134
www.dongchedi.com/article/7594142838871376409
www.dongchedi.com/article/7594113284840669758
www.dongchedi.com/article/7594110260978238014
www.dongchedi.com/article/7594110220667028030
www.dongchedi.com/article/7594109748606665278
www.dongchedi.com/article/7594110099447513624
www.dongchedi.com/article/7594108451488334398
www.dongchedi.com/article/7594106177244561945
www.dongchedi.com/article/7594103370105979417
www.dongchedi.com/article/7594199071733596734
www.dongchedi.com/article/7594198145211761176
www.dongchedi.com/article/7594196964511154713
www.dongchedi.com/article/7594198239285494297
www.dongchedi.com/article/7594197322151068222
www.dongchedi.com/article/7594198145211925016
www.dongchedi.com/article/7594195638192243225
www.dongchedi.com/article/7594198041578455614
www.dongchedi.com/article/7594179233010893336
www.dongchedi.com/article/7594179607033922110
www.dongchedi.com/article/7594177906826625560
www.dongchedi.com/article/7594177530207289918
www.dongchedi.com/article/7594176033486864958
www.dongchedi.com/article/7594174514142462488
www.dongchedi.com/article/7594175199944213017
www.dongchedi.com/article/7594173003894964798
www.dongchedi.com/article/7594172411499954713
www.dongchedi.com/article/7594172274706514456
www.dongchedi.com/article/7594171609930383897
www.dongchedi.com/article/7594171501943931416
www.dongchedi.com/article/7594171895055286808
www.dongchedi.com/article/7594169899916853785
www.dongchedi.com/article/7594168856931762712
www.dongchedi.com/article/7594154845427630617
www.dongchedi.com/article/7594152696526504510
www.dongchedi.com/article/7594154096370991678
www.dongchedi.com/article/7594149478186533401
www.dongchedi.com/article/7594143476796015128
www.dongchedi.com/article/7594143420428370457


www.dongchedi.com/article/7594143309313147417
www.dongchedi.com/article/7594143309313081881
www.dongchedi.com/article/7594143555656942104
www.dongchedi.com/article/7594143559859765822
www.dongchedi.com/article/7594112718668349977
www.dongchedi.com/article/7594111610630013464
www.dongchedi.com/article/7594112414933795353
www.dongchedi.com/article/7594110167684661784
www.dongchedi.com/article/7594108789133951550
www.dongchedi.com/article/7594110242670101016
www.dongchedi.com/article/7594108398888010302
www.dongchedi.com/article/7594198471734198809
www.dongchedi.com/article/7594199227367309886
www.dongchedi.com/article/7594196987835466264
www.dongchedi.com/article/7594196535337353752
www.dongchedi.com/article/7594197773559185944
www.dongchedi.com/article/7594196903693156888
www.dongchedi.com/article/7594197731099771416
www.dongchedi.com/article/7594196461773406745

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/1146839.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

第7.2节 构网型变流器关键参数设计与整定方法

第7.2节 构网型变流器关键参数设计与整定方法 7.2.1 引言:参数整定的核心地位与目标 在构建了构网型变流器(GFM)的多时间尺度控制架构后,控制系统的最终动态性能、稳定裕度及与电网的交互特性,根本上取决于各层级控制环中关键参数的取值。这些参数,如虚拟惯量JJJ、阻尼…

基于SimonK芯片的BLHeli调参技巧:ArduPilot平台实战

深入BLHeli内核:如何让ArduPilot飞控“唤醒”SimonK电调的极限性能你有没有遇到过这样的情况——明明PID调得近乎完美,飞控日志也显示姿态稳定,但一飞起来机臂就“嗡嗡”抖动,摄像头画面像果冻一样扭曲?或者低油门悬停…

深入理解文件上传下载的原理及实现逻辑(3)

文件上传的是根据 http 协议的规范和定义,完成请求消息体的封装和消息体的解析,然后将二进制内容保存到文件。在上传一个文件时,需要把 form 标签的enctype设置为multipart/form-data,同时method必须为post方法。multipart/form-d…

第7.3节 构网控制的数字化实现:从模型到代码

第7.3节 数字化实现:从模型到代码 7.3.1 引言:算法落地与物理世界的桥梁 在完成了构网型变流器(GFM)的多时间尺度控制架构设计与关键参数整定后,如何将基于连续时间域设计的精妙控制算法,可靠、精确、高效地部署在嵌入式数字处理器(如DSP、FPGA)中,是工程实现的最终…

ZStack终端设备入网配置全过程

深入ZStack终端设备入网全过程:从上电到稳定通信的实战解析你有没有遇到过这样的情况?新烧录的Zigbee终端板子反复重启,协调器就是“看不见”它;或者明明显示入网成功,数据却发不出去。这类问题在ZStack开发中极为常见…

ResNet18部署实战:Flask WebUI集成详细步骤

ResNet18部署实战:Flask WebUI集成详细步骤 1. 背景与应用场景 1.1 通用物体识别的工程价值 在AI落地的众多场景中,通用图像分类是基础且高频的需求。从智能相册自动打标签、电商平台商品识别,到工业巡检中的异常物品检测,背后…

ResNet18部署案例:智能安防人脸识别应用

ResNet18部署案例:智能安防人脸识别应用 1. 引言:从通用识别到安防场景的延伸 随着深度学习在计算机视觉领域的广泛应用,图像分类技术已逐步从实验室走向实际工程落地。其中,ResNet-18 作为轻量级残差网络的代表,在保…

基于Java的民宿管理系统毕业论文+PPT(附源代码+演示视频)

文章目录基于Java的民宿管理系统一、项目简介(源代码在文末)1.运行视频2.🚀 项目技术栈3.✅ 环境要求说明4.包含的文件列表(含论文)数据库结构与测试用例系统功能结构前端运行截图后端运行截图项目部署源码下载基于Jav…

ResNet18技术解析:图像分类任务最佳实践

ResNet18技术解析:图像分类任务最佳实践 1. 引言:通用物体识别中的ResNet-18价值定位 在计算机视觉领域,通用物体识别是基础且关键的任务之一。它要求模型能够从自然图像中准确识别出上千类常见物体与场景,如动物、交通工具、建…

GLM-Edge-V-2B:2B轻量模型赋能边缘AI图文交互

GLM-Edge-V-2B:2B轻量模型赋能边缘AI图文交互 【免费下载链接】glm-edge-v-2b 项目地址: https://ai.gitcode.com/zai-org/glm-edge-v-2b 导语:THUDM(清华大学知识工程实验室)推出轻量级多模态模型GLM-Edge-V-2B&#xff…

ResNet18应用案例:零售货架商品识别系统部署

ResNet18应用案例:零售货架商品识别系统部署 1. 引言:通用物体识别与ResNet-18的工程价值 在智能零售、自动化盘点和视觉监控等场景中,快速、准确地识别货架上的商品是实现无人化运营的关键一步。传统方案依赖人工巡检或规则匹配&#xff0…

ResNet18环境部署:极速CPU推理配置完整指南

ResNet18环境部署:极速CPU推理配置完整指南 1. 引言 1.1 通用物体识别的现实需求 在智能安防、内容审核、自动化标注和辅助决策等场景中,通用图像分类是AI落地的第一道门槛。用户需要一个稳定、快速、无需依赖外部API的本地化解决方案。ResNet-18作为…

ResNet18技术详解:Top-3置信度实现原理

ResNet18技术详解:Top-3置信度实现原理 1. 引言:通用物体识别中的ResNet18价值 在计算机视觉领域,通用物体识别是基础且关键的任务之一。它要求模型能够对任意输入图像进行分类,涵盖从自然景观到日常物品的广泛类别。ImageNet 数…

数字频率计FPGA逻辑设计完整示例

用FPGA打造高精度数字频率计:从原理到实战的完整设计之路你有没有遇到过这样的场景?在调试一个无线模块时,发现输出信号频率不稳定;或者在做电机控制项目时,想实时监测转速变化却苦于没有合适的测量工具。这时候&#…

ResNet18实战:智能零售货架分析

ResNet18实战:智能零售货架分析 1. 引言:通用物体识别在智能零售中的价值 随着AI技术的普及,智能零售正从概念走向落地。其中,货架商品识别是实现自动化补货、库存监控和消费者行为分析的核心环节。传统方案依赖人工盘点或条码扫…

实战案例:利用伏安特性曲线优化二极管选型设计

实战案例:如何用伏安特性曲线“看穿”二极管的真实性能你有没有遇到过这样的情况?电路设计看起来毫无问题,参数也全部留了余量——耐压够高、电流有富余,结果一上电,二极管发热严重,甚至短短几分钟就烧毁。…

ResNet18实战案例:智能家居安防系统开发

ResNet18实战案例:智能家居安防系统开发 1. 引言:通用物体识别在智能安防中的核心价值 随着物联网与边缘计算的快速发展,智能家居安防系统正从“被动录像”向“主动感知”演进。传统监控依赖人工回看或简单运动检测,难以区分威胁…

ResNet18性能测试:1000类识别准确率评估

ResNet18性能测试:1000类识别准确率评估 1. 引言:通用物体识别中的ResNet-18价值定位 在计算机视觉领域,图像分类是基础且关键的任务之一。随着深度学习的发展,ResNet(残差网络)系列模型因其出色的性能和…

KeilC51和MDK同时安装后如何正确选择编译器版本

如何在 Keil C51 与 MDK 共存环境下精准选择编译器?实战避坑指南你有没有遇到过这样的场景:打开一个旧的 8051 工程,结果编译时报错“unknown register P0”,而另一个 STM32 项目却提示找不到startup_stm32f103xb.s?这…

ResNet18优化指南:如何减少模型推理时间

ResNet18优化指南:如何减少模型推理时间 1. 背景与挑战:通用物体识别中的效率瓶颈 在当前AI应用广泛落地的背景下,通用物体识别已成为智能监控、内容审核、辅助驾驶等场景的核心能力。其中,ResNet-18作为轻量级深度残差网络的代…