大文件分片上传和断点续传
react+flask大文件上传
技术栈
react
axios
flask
flask_restful
正常上传
前端
1 | import { useState } from "react"; |
后端
1 | from flask_restful import Resource, reqparse |
注意
location
中的form
和files
的区别
如果你的 HTML 表单使用
application/x-www-form-urlencoded
或multipart/form-data
编码类型提交数据,那么这些数据会存储在request.form
中。location='files'
用来指定请求中的 文件上传 数据(request.files
),通过multipart/form-data
编码类型以文件的形式上传文件与表单混合的情况:如果你的请求同时包含文件和表单数据(如上传文件的同时提交一些其他文本字段),你可以在
reqparse
中同时使用location='form'
和location='files'
来分别解析这两类数据:1
2
3
4
5
6
7
8parser = reqparse.RequestParser()
# 解析表单数据
parser.add_argument('username', type=str, location='form')
parser.add_argument('email', type=str, location='form')
# 解析文件上传
parser.add_argument('picture', type=werkzeug.datastructures.FileStorage, location='files')
分片上传
逻辑
前端
- 将文件按照大小进行分片,之后将分片统一发送
- 由于分片可能不会按照顺序到达,并且需要确定每个分片对应的文件,以及需要知道是否是最后一块
- 使用
file
的hash
作为文件的统一标识,以及文件的后缀 - 使用
index
作为分片的顺序 - 使用
end:1
作为最后一块的结尾标识 - 使用
chunk
存放对应的分片数据
- 使用
- 生成
hash
使用webworker
使用其他进程来处理,防止卡顿
后端
+
前端
index.jsx
1 | import { useState } from "react"; |
hashChunk.js
1 | // 导入脚本 |
后端
1 | from flask_restful import Resource, reqparse |
快速上传
原理就是在上传文件前查询文件时候存在
前端
1 | // 文件秒传 |
后端
1 | + def verifyFile(hash, suffix): |
断点续传
思路:
暂停利用了axois
的一个api
Axios 支持以 fetch API 方式——
AbortController
取消请求
但是这里要注意使用,因为我们只是暂停一次请求,我们需要在再次点击上传按钮的时候,将上次的取消请求信号取消,不然就发不出去了
续传就是先向服务端请求获取文件列表,之后再根据缺少的文件上传剩下的文件
前端
1 | import { useState, useRef } from "react"; |
后端
1 | from flask_restful import Resource, reqparse |
总结
分片上传就是将大文件使用
slice
分片,使用webworker
对分片进行hash
求值,最后统一上传快速上传就是上传之前请求一次服务器
断点续传是利用
Axios
的AbortController
取消请求,以及根据服务器返回的数据再次上传文件
查阅的资料
评论