如何让你的大文件上传变得又稳又快?

比特拓荒
• 阅读 3474

随着网络环境的大幅改善及网络资费的显著降低,人们在网络上的互动不再局限于传统的文本内容,图片、语音、视频等纷纷加入了互动行列。

相较于文本内容而言,多媒体在易用性和情感表达上更有优势,当然相对文本,体积也大了很多。比如一条文本消息只有不到 100 字节,但一条视频消息可能超过 100 MB。这就导致多媒体在网络传输、实时触达等方面相对文本内容会更难一些。

在网站或者程序中,除了用户交流的图片、视频等互动消息,还有其他形式的大文件也越来越多。保证大文件的上传稳定是一个需要长期投入和突破的重点。今天,我们就来看看都有哪些手段可以保证用户拥有一个良好的上传体验。

如何让资源传递又快又稳

或许大家会注意到,使用 QQ 时,朋友发送给你的图片和视频会加载一段时间才会显示,这是因为程序并不是发送文件给你,而是发送了文件路径,当我们访问路径后才会加载文件。这是当前主流的大文件通讯方式,即:

  • 上传文件到文件服务器
  • 推送文件路径
  • 收到文件路径
  • 加载文件

这么做是因为大文件的传输耗时过长,会影响消息的即时性,所以不会直接传送文件。

那么,我们如果要想让图片、视频、语音等多媒体消息发送得又快又稳,就可以从“上传多媒体文件到文件服务器”这一步上着手。

上传接入点

第一种优化上传文件的手段是优化上传接入点。

上传请求到文件服务器,服务器响应建联,上传端再继续传递数据,直至上传完成。这个过程的耗时越短就会让人感觉网速越快。

然而我们国家目前的固网宽带运营商构成复杂,跨运营商网络访问的高延迟和不稳定性一直是个比较棘手的难题。对于传输数据更多的视频、图片等多媒体文件来说,跨运营商来上传文件,多次 RTT(Round-Trip-Time,往返时延)的体验则会更差。

目前针对这种网络情况的主流做法是,对不同的网络运营商提供不同的上传接入点 IP,然后通过运营商 DNS 解析,让用户能通过本运营商的上传接入点来快速上传文件。同时后端的图片上传存储服务后会部署在多线机房,方便快速地把文件流提交给存储层,从而避免从接入点到存储服务的跨网开销,并解决其他运营商的用户下载图片时需要跨网的问题。

不过,虽然多个运营商接入点 IP 能解决跨运营商网络访问的问题,但是在管理和使用上会比较复杂。因此大部分服务提供商会利用多线 BGP(Border Gateway Protocol,边界网关协议)机房托管,这样就可以只提供 IP ,让访问用户自主选择最佳路由。

分块上传

除去上传接入点的优化,分块上传也可以提升多媒体文件的上传性能和成功率。

分块上传,是指在上传客户端,把需要上传的文件按照一定规则切分为多个数据块,并按照规则标记序号,然后再分别上传这些数据块,服务端接收到后,按照序号重新将多个数据块组装成完整的文件。

对于图片、视频这种较大的文件来说,分块上传可以让客户端在分块完成后,使用并发的方式充分利用网络带宽同时上传多个分块,有效提升了上传效率。此外,在一些网络环境较差、信号不稳定的场景下,采用分块的方式,在上传失败后进行重试时,只需要重传某一个失败的分块,不必重新上传整个文件,显著提升了重新发送的成功率。

在分块上传中,分块大小也是一个重要的问题。如果分块太大,片数少,上传的并发度不够,可能会降低上传效率,而且每个大的分块在失败后重传的成本会比较高。但是如果分块太小,片数多,并发需要的连接数又太多,多条连接会降低网络的整体吞吐,客户上传端和服务接收端拆分与合并分块的开销也相应增加,而且传输时的额外流量也会更多。

所以,不同网络环境下如何选择一个合适的分块大小至关重要。一般来说,在网络状况较好的环境,比如在 WiFi、4G 下,相应的分块大小应该设置得更大一些;而在 2G、3G 弱网情况下,分块可以适当设置小一点。

断点续传

因为大文件的上传耗时较长,如果用户由于网络断开、设备重启等原因,需要在上传未完成时暂停上传任务。当然,用户肯定不会希望下次上传是从头开始。因此如何从暂停位置开始上传的功能就变得必要起来。这就是我们常说的“断点续传”

断点续传是通过给每一次上传行为分配一个唯一的任务标识,每个分块在上传时除了携带自己的序号外,还需要带上这个任务标识,服务端针对接收到的同一个任务标识的分块进行暂存,即使由于某个原因暂停上传了,这些暂存的分块也不会马上清理掉,而是保留一定的时间。

当上传端需要继续上传时,在请求的同时会继续携带之前的任务标识。客户端接收到后会检查服务端已有分块的情况,如果没有过期就继续从上次断开的分块位置进行上传,反之则会重新上传。

断点续传功能在上传大文件时,可解决传输较大文件过程中因网络错误而必须重头再来的痛点,对于提升用户上传体验是很明显的。

如何快速拥有这些上传优势

如果想要完成上述大文件上传优化,需要考虑到架构、设计、运维等方面,不仅优化成本高,改造时间相对也长。想要拥有上面所说的这些优势,选择又拍云存储就可以了。

又拍云存储可以让大型文件通过 CDN 就近完成上传、上传加速传输、分块上传和断点续传,同时还可以使用图片处理、视频处理、文件压缩解压缩对文件进行处理。在文件访问的时候,也会通过 CDN 使用大文件分段缓存、视频拖拉、链路优化等功能进行全网分发。保证企业海量数据的传输、处理、存储、分发与容灾需求。

推荐阅读

CSS 盒子的边距塌陷

热门剧本杀与 SaaS 的不解之缘

点赞
收藏
评论区
推荐文章
blmius blmius
3年前
MySQL:[Err] 1292 - Incorrect datetime value: ‘0000-00-00 00:00:00‘ for column ‘CREATE_TIME‘ at row 1
文章目录问题用navicat导入数据时,报错:原因这是因为当前的MySQL不支持datetime为0的情况。解决修改sql\mode:sql\mode:SQLMode定义了MySQL应支持的SQL语法、数据校验等,这样可以更容易地在不同的环境中使用MySQL。全局s
Wesley13 Wesley13
3年前
MySQL部分从库上面因为大量的临时表tmp_table造成慢查询
背景描述Time:20190124T00:08:14.70572408:00User@Host:@Id:Schema:sentrymetaLast_errno:0Killed:0Query_time:0.315758Lock_
美凌格栋栋酱 美凌格栋栋酱
6个月前
Oracle 分组与拼接字符串同时使用
SELECTT.,ROWNUMIDFROM(SELECTT.EMPLID,T.NAME,T.BU,T.REALDEPART,T.FORMATDATE,SUM(T.S0)S0,MAX(UPDATETIME)CREATETIME,LISTAGG(TOCHAR(
皕杰报表之UUID
​在我们用皕杰报表工具设计填报报表时,如何在新增行里自动增加id呢?能新增整数排序id吗?目前可以在新增行里自动增加id,但只能用uuid函数增加UUID编码,不能新增整数排序id。uuid函数说明:获取一个UUID,可以在填报表中用来创建数据ID语法:uuid()或uuid(sep)参数说明:sep布尔值,生成的uuid中是否包含分隔符'',缺省为
Wesley13 Wesley13
3年前
VBox 启动虚拟机失败
在Vbox(5.0.8版本)启动Ubuntu的虚拟机时,遇到错误信息:NtCreateFile(\\Device\\VBoxDrvStub)failed:0xc000000034STATUS\_OBJECT\_NAME\_NOT\_FOUND(0retries) (rc101)Makesurethekern
Wesley13 Wesley13
3年前
FLV文件格式
1.        FLV文件对齐方式FLV文件以大端对齐方式存放多字节整型。如存放数字无符号16位的数字300(0x012C),那么在FLV文件中存放的顺序是:|0x01|0x2C|。如果是无符号32位数字300(0x0000012C),那么在FLV文件中的存放顺序是:|0x00|0x00|0x00|0x01|0x2C。2.  
Wesley13 Wesley13
3年前
mysql设置时区
mysql设置时区mysql\_query("SETtime\_zone'8:00'")ordie('时区设置失败,请联系管理员!');中国在东8区所以加8方法二:selectcount(user\_id)asdevice,CONVERT\_TZ(FROM\_UNIXTIME(reg\_time),'08:00','0
Wesley13 Wesley13
3年前
PHP创建多级树型结构
<!lang:php<?php$areaarray(array('id'1,'pid'0,'name''中国'),array('id'5,'pid'0,'name''美国'),array('id'2,'pid'1,'name''吉林'),array('id'4,'pid'2,'n
Wesley13 Wesley13
3年前
Java日期时间API系列36
  十二时辰,古代劳动人民把一昼夜划分成十二个时段,每一个时段叫一个时辰。二十四小时和十二时辰对照表:时辰时间24时制子时深夜11:00凌晨01:0023:0001:00丑时上午01:00上午03:0001:0003:00寅时上午03:00上午0
Stella981 Stella981
3年前
Django中Admin中的一些参数配置
设置在列表中显示的字段,id为django模型默认的主键list_display('id','name','sex','profession','email','qq','phone','status','create_time')设置在列表可编辑字段list_editable
Python进阶者 Python进阶者
1年前
Excel中这日期老是出来00:00:00,怎么用Pandas把这个去除
大家好,我是皮皮。一、前言前几天在Python白银交流群【上海新年人】问了一个Pandas数据筛选的问题。问题如下:这日期老是出来00:00:00,怎么把这个去除。二、实现过程后来【论草莓如何成为冻干莓】给了一个思路和代码如下:pd.toexcel之前把这