Loading [MathJax]/jax/output/CommonHTML/config.js
前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
MCP广场
社区首页 >专栏 >老弟做了个网盘,炸了!

老弟做了个网盘,炸了!

原创
作者头像
程序员鱼皮
发布于 2021-08-13 05:45:36
发布于 2021-08-13 05:45:36
9270
举报
文章被收录于专栏:鱼皮客栈鱼皮客栈

趣讲文件上传功能的巧妙设计

大家好,我是鱼皮。

不知道大家有没有想过制作一款自己的网盘呢?这不,我学编程的老弟小阿巴做了一个,非常激动地找我来体验。

打开网盘,界面仿的还不错,我简单试了下文件的上传和下载,没有什么问题。

阿巴网盘
阿巴网盘

正当小阿巴洋洋得意时,我试着上传一个 1 GB 大小的文件。结果文件上传到 99% 时,网络一抖,文件上传失败,竟然还要从 0 开始重新上传?!

小阿巴无奈地挠挠头:网络不好,怪我咯?

我直接一巴掌甩过去,要知道,制作网盘可不是一件容易的事!

先从最基础的功能来说,要实现文件的上传、存储、下载、文件和目录管理。如果要真正上线、开放给其他人使用,还要考虑到权限管理、接口访问、CDN 加速,无论哪点自己来做都是很麻烦的。

所以除了学习之外,如果想要搭建自己的私人网盘,建议直接选择一些开源的,比如主流的 Seafile、Nextcloud、Cloudreve、OwnCloud 都可以。

当然,公用网盘最要命的还是带宽、存储等资源的费用,所以为了节约成本、支持更多用户访问,很多网盘都采取了限速、限制容量策略。

小阿巴:做了网盘这么麻烦啊,我放弃我放弃。。。

我笑到:虽然想做好网盘很难,但我们可以一步步来,学习每个功能中的优秀设计,相信最后也能做出一款不错的网盘。今天就先从 文件上传 讲起吧,解决下刚刚上传失败必须从 0 重新上传的问题等。

文件上传设计

文件上传顾名思义就是把文件从本地电脑发送到存储文件的远程服务器上,小文件的上传倒没有什么好说的,主要考虑的是大文件上传怎么 更快、更稳定、更灵活、更快响应 等等,以提高用户的体验。

这里分享几个经典的大文件上传设计,包括文件分块、并发上传、断点续传、秒传、异步上传。

文件分块

既然小文件的处理相对容易,那不妨在发送前,把大文件分割为多个连续的小文件,一块一块地发送。

文件分块
文件分块

此外,需要在发送每一个文件块时,额外传输一些信息,比如当前块数、文件总块数、文件大小、所属原文件标识(MD5)等:

这样,服务器就能一块一块地接收,把这些文件块保存到临时目录中。当接收到最后一块时,把之前的所有文件块再拼接到一起,就能组成完成的原文件啦。

并发上传

将大文件分块后,就可以通过多线程并发上传,同时传输多个块:

串行上传和并发上传
串行上传和并发上传

要根据网络情况决定是否并发上传、同时并发上传多少个块,不是并发数越多越好。网络好的话,并发数量调大一些,能够大大提高文件整体上传效率;相反,盲目调整并发数,上传可能会更慢。

断点续传

对于大文件来说,上传中断后如果要从 0 开始重传,就太让人崩溃了!

推荐使用断点续传技术,原理很简单,在文件分块的基础上,服务器记录一下原文件对应的上传进度,每接收到一个块,就更新一下进度。这样,即使网络故障导致上传失败,也能从上传进度中知道哪些文件块已上传、接下来需要从哪一块重新开始了,而不用从第 1 块开始重新传输。

断点续传
断点续传

该原理同样适用于文件下载。

断点续传有很多种实现方式,自主实现、HTTP 协议 1.1 等,感兴趣的同学可以了解下。

秒传

不知道大家有没有发现,有时,我们上传一个几 GB 的超大文件竟然可以在 1 秒内完成!

这是咋实现的呢?真相只有一个,该文件肯定之前已经被上传过了!

这就是经典的秒传技术。

上传文件前,先在客户端(比如浏览器)根据文件内容计算出文件的 MD5 值,相同内容的文件 MD5 值必然相同。然后在服务器已上传文件数据库中查找该 MD5 对应的文件是否已存在。如果不存在,上传文件并在上传成功后将该文件信息插入数据库,过程如下:

文件秒传 - 文件不存在
文件秒传 - 文件不存在

若文件已存在,直接新建一个对该文件的引用就行了,不必重复上传,过程如下:

文件秒传 - 文件已存在
文件秒传 - 文件已存在

不过要注意,不同内容文件的 MD5 值也可能会相同(碰撞),导致用户下载到不是自己上传的文件,所以检验重复时,还可以补充一些校验,比如针对文件前几位再生成一个 MD5、用其他 Hash 算法再生成一个校验值等。

异步上传

除了同步上传外,当我们要上传的文件不在本地而是已经存在对应 url 时,也可以采用 全异步上传 的方式,将文件上传变成一个 任务

用户输入要上传的文件 url,点击上传后,不需要一直在文件上传页面等着,而是只需要告诉后台 “我要执行文件上传”,并向后台新建一个文件上传任务,就可以快速响应用户了,比如 “文件上传中,请留意通知”。等后台取出并真正完成文件上传的任务后,给用户发送通知就可以了。

整体步骤如下:

异步上传
异步上传

最后,如果只是需要在开发中用到文件上传,大可不必自己实现上述功能,用个现成的对象存储服务就好了。比如七牛云,分块上传什么的都给我们做好了,也可以参考七牛云 SDK 文档(https://github.com/qiniu)来了解它们的实现方式。

我是鱼皮,最后再送大家一些 帮助我拿到大厂 offer 的学习资料

跑了,留下 6T 的资源!

欢迎阅读 我从 0 自学进入腾讯的编程学习、实习、求职、考证、写书经历,不再迷茫!

我学计算机的四年,共勉!

以上就是本期分享,有帮助的话点个赞吧 ❤️

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
暂无评论
推荐阅读
编辑精选文章
换一批
论网盘的秒存与限制下载速度(看完这个你可能还是不想开网盘会员)
hello,我码神又回来了,这几天做个入门项目,有点头秃,开个小章来混混水,都做好了,发车了。 提到网盘大家都不陌生,小到小学生,大到中年大叔,大家可谓是对网盘又爱又狠,爱上网盘的便捷,恨上网盘的慢,慢,慢!!!今天我们就来聊一下网盘的爱恨情仇 1.网盘为什么能秒传? 首先我们来科普一下文件上传的知识 文件上传顾名思义就是把文件从本地电脑发送到存储文件的远程服务器上,小文件的上传倒没有什么好说的,主要考虑的是大文件上传怎么 更快、更稳定、更灵活、更快响应 等等,以提高用户的体验。
秋名山码神
2022/12/13
1.3K0
论网盘的秒存与限制下载速度(看完这个你可能还是不想开网盘会员)
Spring Boot 如何上传大文件?骚操作~
最近遇见一个需要上传超大大文件的需求,调研了七牛和腾讯云的切片分段上传功能,因此在此整理前端大文件上传相关功能的实现。
架构师修炼
2020/12/16
2.5K0
Spring Boot 如何上传大文件?骚操作~
大文件上传和断点续传_文件断点续传实现的思路
支持大文件批量上传(20G)和下载,同时需要保证上传期间用户电脑不出现卡死等体验;
全栈程序员站长
2022/09/21
2.1K0
大文件上传和断点续传_文件断点续传实现的思路
深入理解文件上传下载的原理及实现逻辑
文件上传的是根据 http 协议的规范和定义,完成请求消息体的封装和消息体的解析,然后将二进制内容保存到文件。
Lion 莱恩呀
2025/01/01
4400
深入理解文件上传下载的原理及实现逻辑
Java如何实现大文件分片上传,断点续传和秒传
关于文件上传模块,主要难点还是集中在大文件上传,毕竟我们无法确保在一个http连接中,能够将一个大文件完整传输过来,特别是在网络环境不稳定的情况下,如果是这样的话,一旦传输过程中出现错误,那就意味着需要重新传输整个文件,相信这是我们都不希望看到的局面,而本文就是来介绍打破这种局面的办法。
大忽悠爱学习
2022/11/12
4.6K0
Java如何实现大文件分片上传,断点续传和秒传
聊一聊前端上传大文件的几种方式。
使用PHP来展示常规的表单上传是一个不错的选择。首先构建文件上传的表单,并指定表单的提交内容类型为enctype="multipart/form-data",表明表单需要上传二进制数据。
用户6835371
2021/06/01
2.9K0
实战篇:断点续传?文件秒传?手撸大文件上传
最近接到一个新的需求,需要上传2G左右的视频文件,用测试环境的OSS试了一下,上传需要十几分钟,再考虑到公司的资源问题,果断放弃该方案。
阿Q说代码
2021/09/09
1K1
实战篇:断点续传?文件秒传?手撸大文件上传
springboot实战之文件分片上传、断点续传、秒传
上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有比较好的上传体验呢,答案有的,就是下边要介绍的几种上传方式
lyb-geek
2019/11/20
25K2
springboot实战之文件分片上传、断点续传、秒传
Java实现浏览器大文件上传
文件上传是许多项目都有的功能,用户上传小文件速度一般都很快,但如果是大文件几个g,几十个g的时候,上传了半天,马上就要完成的时候,网络波动一下,文件又要重新上传,抓狂🤯。那有什么办法解决解决这个问题,答案就是把文件分片,一段一段把文件拆开上传。
一杯茶Ja
2024/09/15
2820
Node+Vue 实现大文件上传,断点续传等
【每日更新 Suggest 👍 question & answers】正经的前端学习 🌟🌟 一个 ☝️ 正经的前端学习,以阶段性来驱动学习,每天进步一点点🤏 !leetcode题解,记录自己的leetcode解题之路…… webvueblog.github.io/file-breakp… 地址 👇 github.com/webVueBlog/… Node+Vue 实现大文件上传,断点续传等 Vue 大文件上传和断点续传(帮忙点赞star谢谢,感谢♥) file-breakpoint-continue 源代码
达达前端
2022/04/29
2.9K0
Node+Vue 实现大文件上传,断点续传等
大文件上传实践分享
导读 在互联网时代,大文件上传已成为常见的需求,无论是企业还是个人用户,都可能面临大文件传输的挑战。本文将分享一些实践经验,帮助更高效地处理大文件上传问题。我们将探讨选择合适的传输工具、优化网络设置、分块上传等策略,以及一些实用的技巧和注意事项。通过这些实践分享,将能够提高文件上传的成功率,节省时间并减少麻烦。让我们一起探索大文件上传的最佳实践吧!
京东技术
2024/03/18
4420
大文件上传实践分享
大文件上传:秒传、断点续传、分片上传
文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。
程序员小猿
2022/03/09
2.2K0
大文件上传时如何做到秒传?
文件上传是一个老生常谈的话题了,在文件相对比较小的情况下,可以直接把文件转化为字节流上传到服务器,但在文件比较大的情况下,用普通的方式进行上传,这可不是一个好的办法,毕竟很少有人会忍受,当文件上传到一半中断后,继续上传却只能重头开始上传,这种让人不爽的体验。那有没有比较好的上传体验呢,答案有的,就是下边要介绍的几种上传方式
二哥聊运营工具
2022/07/11
1.1K0
大文件上传时如何做到秒传?
springboot+vue实现在线网盘(云盘)系统
今天教大家如何设计一个网盘(云盘)系统系统 , 基于目前主流的技术:前端vue,后端springboot。
家庭Q秋-3993387644
2025/05/26
1830
springboot+vue实现在线网盘(云盘)系统
面试官:大文件上传如何做断点续传?
分片上传,就是将所要上传的文件,按照一定的大小,将整个文件分隔成多个数据块(Part)来进行分片上传
用户3806669
2021/04/15
8.4K0
面试官:大文件上传如何做断点续传?
快速学习-断点续传解决方案
通常视频文件都比较大,所以对于媒资系统上传文件的需求要满足大文件的上传要求。http协议本身对上传文件大 小没有限制,但是客户的网络环境质量、电脑硬件环境等参差不齐,如果一个大文件快上传完了网断了,电断了没 有上传完成,需要客户重新上传,这是致命的,所以对于大文件上传的要求最基本的是断点续传。
cwl_java
2020/01/14
1.2K0
快速学习-断点续传解决方案
大文件上传原理及实现方案
在网络应用中,大文件上传是一个技术挑战。本文详细解析了大文件上传的核心原理,并探讨了多种实现方案。从基本的文件分割、断点续传到复杂的并行上传,文章涵盖了一系列技术细节和最佳实践,包括如何处理网络波动、提高数据传输效率等关键问题。此外,还介绍了相关的前端和后端技术支持。无论是开发者还是架构师,这篇文章都将提供有力的技术指导和实战参考,帮助读者高效解决大文件上传问题。
京东技术
2024/02/27
3K0
大文件上传原理及实现方案
AspNetCore中的文件上传与下载优化
在现代Web开发中,文件上传和下载是常见的功能需求。然而,随着文件大小的增加或网络环境的变化,传统的文件上传和下载方式可能会遇到性能瓶颈或用户体验问题。本文将深入讲解如何在AspNetCore中实现大文件上传、分块上传、断点续传以及高效的文件下载。
郑子铭
2025/05/12
1330
AspNetCore中的文件上传与下载优化
网盘系统设计:万亿 GB 网盘如何实现秒传与限速?
网盘,又称云盘,是提供文件托管和文件上传、下载服务的网站(File hostingservice)。人们通过网盘保管自己拍摄的照片、视频,通过网盘和他人共享文件,已经成为了一种习惯。我们准备开发一个自己的网盘应用系统,应用名称为“DBox”。
小熊学Java
2023/12/04
1.1K0
网盘系统设计:万亿 GB 网盘如何实现秒传与限速?
Spring学习笔记(三十六)——SpringBoot 实现大文件分片上传、断点续传及秒传
simple-uploader文档案例:https://github.com/simple-uploader/vue-uploader vue-simple-uploader文档案例:https://github.com/simple-uploader/Uploader/blob/develop/README_zh-CN.md
不愿意做鱼的小鲸鱼
2022/09/26
5.5K1
Spring学习笔记(三十六)——SpringBoot 实现大文件分片上传、断点续传及秒传
推荐阅读
相关推荐
论网盘的秒存与限制下载速度(看完这个你可能还是不想开网盘会员)
更多 >
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档