python vue3实现大文件分段续传(断点续传)--带暂停和继续功能

news/2025/1/7 23:33:31/

后端内容无变化具体设置可参考上一篇点击进入上一篇,需要注意的是big_file_upload_backend/settings.py下的 是statics 多个s其实无所谓,但是要一致

STATIC_URL = "statics/"
STATICFILES_DIRS = [os.path.join(BASE_DIR, "../statics"),
]

前端创建项目:

在这里插入图片描述

前端增加了暂停和继续上传功能具体代码:

<template><div class="button"><el-uploadref="uploadRef"class="upload-demo":http-request="uploadFile":show-file-list="false"><el-button type="primary">点击上传文件</el-button></el-upload></div><div><el-button @click="is_paused" type="primary">暂停</el-button><el-button @click="is_continue" type="success">继续</el-button></div>
</template>
<script setup>
import axios from 'axios'
import {sha256} from 'js-sha256'
import {ref} from "vue";
// 标记暂停
const flag = ref(true)
// 存放暂停以后得
const axios_list = ref([])
const sha256Promise = ref('')const checkUploadedChunks = (sha256Promise) => {return axios.post('http://127.0.0.1:8000/api/check', {sha256Promise: sha256Promise}).then(response => {return response.data; // response.data 就是下边的 uploadedChunks});
};
const uploadFile = ({file}) => {// 每次调用之前先重置一下axios_list.value = []flag.value = true// 每4MB为一个小文件const chunkSize = 4 * 1024 * 1024; // 4MB// 文件总大小const fileSize = file.size;// 分成了多少个片段const chunks = Math.ceil(fileSize / chunkSize);// 保证文件唯一sha256Promise.value = sha256(file.name); // sha256的参数只接收字符串return checkUploadedChunks(sha256Promise.value).then(async uploadedChunks => {if (uploadedChunks.length === chunks) {console.log("已经上传完成就不需要再重复上传")return Promise.resolve();}for (let i = 0; i < chunks; i++) {const formData = new FormData();// 将之前上传过的片段过滤掉,即不上传之前上传过的内容if (uploadedChunks.includes(i + 1)) {console.log("跳过已上传部分片段:",  i + 1);continue;}const start = i * chunkSize;// 将文件分片const chunk = file.slice(start, start + chunkSize);// 使用FormData形式上传文件formData.append('chunk', chunk);formData.append('chunkNumber', i + 1);formData.append('chunksTotal', chunks);formData.append('sha256Promise', sha256Promise.value);formData.append('filename', file.name);// 一次只上传一个片段,本次上传完成后才上传下一个if (flag.value){const res = await axios.post('http://127.0.0.1:8000/api/upload', formData)// console.log("formData", formData) // 直接打印显示的为空,但是实际上是有值的,可以用下面的方法打印// for (const [key, value] of formData) {//   console.log(key, value)// }}else {axios_list.value.push(formData)}}});
};
const is_paused = () => {flag.value = false
}const is_continue = async () => {if (axios_list.value.length>0){// 先检查已经上传过的checkUploadedChunks(axios_list.value[0].get("sha256Promise")).then(async uploadedChunks=>{for (const item of axios_list.value) {// uploadedChunks: 已经上传过的片段列表let chunkNumber = parseInt(item.get("chunkNumber"))// 已上传过则跳过if (!uploadedChunks.includes(chunkNumber)){await axios.post('http://127.0.0.1:8000/api/upload', item)if (!flag.value){break}}else {console.log("跳过已经上传过的片段号:", chunkNumber)}}})}else {//   消费完了,没有数据了}flag.value = true
}
</script><style >
html, body{height: 100%;width: 100%;//background-color: pink;
}
</style>

效果如下:

在这里插入图片描述

点击暂停的效果:

在这里插入图片描述

再点击继续

在这里插入图片描述


http://www.ppmy.cn/news/1561398.html

相关文章

iOS - AutoreleasePoolPage 节点为空时的处理逻辑

1. 空 Page 的判断 struct AutoreleasePoolPage {id *next; // 指向下一个可用位置id *begin(); // 页面起始位置bool empty() {return next begin(); // next 指针回到起始位置表示为空}// 页面的边界id *begin() { return (id *)(this 1); }id *…

【数据库系统概论】数据库设计--复习极简总结版

一、数据库设计概述 数据库应用系统&#xff1a;使用数据库的各类信息系统。数据库设计&#xff08;DBD&#xff09; 广义&#xff1a;设计整个数据库应用系统。狭义&#xff1a;设计数据库本身&#xff0c;即各级模式并建立数据库。数据库设计的一般定义&#xff1a;针对给定…

Vue3钩子是什么?

钩子是 Vue.js 生命周期中的特定方法&#xff0c;它们在组件的不同阶段被调用。这些方法被称为“钩子”是因为它们“钩入”了 Vue.js 的生命周期&#xff0c;允许开发者在组件创建、更新、销毁等关键点执行自定义代码。 在 Vue.js 中&#xff0c;钩子方法包括&#xff1a; 创…

基于云架构Web端的工业MES系统:赋能制造业数字化变革

基于云架构Web端的工业MES系统:赋能制造业数字化变革 在当今数字化浪潮席卷全球的背景下,制造业作为国家经济发展的重要支柱产业,正面临着前所未有的机遇与挑战。市场需求的快速变化、客户个性化定制要求的日益提高以及全球竞争的愈发激烈,都促使制造企业必须寻求更加高效、智…

如何使用Spring Boot框架整合Redis:超详细案例教程

目录 # 为什么选择Spring Boot与Redis整合&#xff1f; 1. 更新 pom.xml 2. 配置application.yml 3. 创建 Redis 配置类 4. Redis 操作类 5. 创建控制器 6. 启动应用程序 7. 测试 # 为什么选择Spring Boot与Redis整合&#xff1f; 将Spring Boot与Redis整合可以充分利…

计算机网络(第8版)第3章课后习题--透明传输

【3-11】 试分别讨论以下各种情况在什么条件下是透明传输&#xff0c;在什么条件下不是透明传 输。(提示&#xff1a;请弄清什么是“透明传输”,然后考虑能否满足其条件。) (1)普通的电话通信。 (2)互联网提供的电子邮件服务。 解 答 &#xff1a; 透明传输是指在数据传输…

计算机网络--应用层--HTTP

计算机网络&#xff08;第8版&#xff09;谢希仁编著 P276笔记 超文本传输协议HTTP 定义了浏览器向万维网服务器请求资源的方式&#xff1a;&#xff08;1&#xff09;插入URL&#xff1b;&#xff08;2&#xff09;点击超链接 特点&#xff1a;&#xff08;1&#xff09;无…

【苏德矿高等数学】第1讲:有界函数、无界函数、复合函数

我还是喜欢高数&#xff0c;虽然已经是硕士在读了&#xff0c;但是我还是想再学一遍高数&#xff0c;学高数放松放松&#xff08;汗流浃背了&#xff09;&#xff0c;笔记就是按视频顺序来的&#xff0c;随缘记录&#xff0c;其实我只是想用学习数学掩盖自己的一些情绪&#xf…