27

从零开始一个文件分块上传【后端为Golang】

 4 years ago
source link: https://studygolang.com/articles/28665
Go to the source link to view the article. You can view the picture content, updated content and better typesetting reading experience. If the link is broken, please click the button below to view the snapshot at that time.
neoserver,ios ssh client

今天刚好看到了一片文章分块上传的文章,自己并没有实现过。思来想去实践一下并且前后双端进行实现。文笔不好请多担待,不明白评论看到即回。俗话事吃水不忘挖井人,附上文章链接

大规格文件的上传优化---凹凸实验室

整体思路

文件分块上传:

主要利用前端 Blob 进行 Slice 切块。然后后端这边把这几个分块合并成一个完整的文件(File是继承Blob对象)

Blob MDN参考链接

断点续传

该功能也是在文件分块上传的基础上进行实现的。我们把一个文件分成了几个区块,重新上传的时候进行匹配,选择没有上传的区块进行上传。

文件秒传

其实这是一个假功能。。。可能是我这么理解的吧。用户进行上传的进行HASH匹配,如果存在文件HASH值,就不需要上传了直接从服务器复制给他。

功能分析

大致如此,好滴我们来实现一下吧。 借用一下凹凸实验室提供的这张图(哈哈哈懒得自己做图)

fm6BRnA.png!web

根据这张图我们大概分析出会存在三个接口

  • 文件是否完整上传完毕
  • 上传文件区块
  • 合并已经上传的区块

Golang 实现

创建路由

本教程采用Gin进行实现路由,当然纯原生也实现的。等同嘛,大伙尽量进行举一反三。

R3ARJba.png!web

还有一个检查路径的函数

fquqqyR.png!web

文件检查

实现第一个接口用于取文件状态和以及上传的文件区块

y6FZ7vQ.png!web

上传区块

jEBRfev.png!web

进行区块合并

Y3EJFjJ.png!web

前端实现

既然上传文件,当然我们需要一个上传框框啦。

<input type="file">
复制代码

前期准备

准备一下接口 咱们先准备一下三个请求的接口,这三个接口分别对应上面的三个接口

YfuqiyM.png!web

接口准备完了,我们当然是文件发生变化之后才开始请求嘛

NBjQJ3q.png!web

文件分块

当用户选择完文件之后我们对他进行分块处理

rI7fYzZ.png!web

计算文件HASH

这里用到了一个库进行MD5,下面提供一个地址。当然你也可以自己选择其他地方下载或者npm

<script src="https://cdn.bootcdn.net/ajax/libs/spark-md5/3.0.0/spark-md5.min.js"></script>
复制代码
FfMNJvz.png!web

About Joyk


Aggregate valuable and interesting links.
Joyk means Joy of geeK