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

news2025/1/8 17:39:11

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

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

前端创建项目:

在这里插入图片描述

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

<template>
  <div class="button">
    <el-upload
        ref="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.coloradmin.cn/o/2273341.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

STM32之CAN通讯(十一)

STM32F407 系列文章 - CAN通讯&#xff08;十一&#xff09; 目录 前言 一、CAN 二、CAN驱动电路 三、CAN软件设计 1.CAN状态初始化 2.头文件相关定义 3.接收中断服务函数 4.用户层使用 1.用户层相关定义 2.发送数据 3.接收数据 1.查询方式处理 2.中断方式处理 3…

初学Linux电源管理

学习文档出处&#xff1a; 万字整理 | 深入理解Linux电源管理&#xff1a;万字整理 | 深入理解Linux电源管理-CSDN博客 电源管理 因为设备需要用电&#xff0c;而且设备中的各个硬件所需要的电压是不一样的。故计算机需要对硬件的电源状态管理。但是电能并不是免费的&#x…

若依中Feign调用的具体使用(若依微服务版自身已集成openfeign依赖,并在此基础上定义了自己的注解)

若依中Feign调用具体使用 注意&#xff1a;以下所有步骤实现的前提是需要在启动类上加入注解 EnableRyFeignClients 主要是为开启feign接口扫描 1.创建服务提供者(provider) 导入依赖(我在分析依赖时发现若依本身已经引入openfeign依赖,并在此基础上自定义了自己的EnableRyF…

CS·GO搬砖流程详细版

说简单点&#xff0c;就是Steam买了然后BUFF上卖&#xff0c;或许大家都知道这点&#xff0c;但就是一些操作和细节问题没那么明白。我相信&#xff0c;你看完这篇文章以后&#xff0c;至少会有新的认知。 好吧&#xff0c;废话少说&#xff0c;直接上实操&#xff01; 首先准…

每日一题:链表中环的入口结点

文章目录 判断链表环的入口节点描述数据范围&#xff1a;复杂度要求&#xff1a;输入输出 示例代码实现思路解析注意事项&#xff1a; 判断链表环的入口节点 描述 给定一个链表&#xff0c;判断该链表是否存在环。如果存在环&#xff0c;返回环的入口节点&#xff1b;如果不存…

以C++为基础快速了解C#

using System: - using 关键字用于在程序中包含 System 命名空间。 一个程序一般有多个 using 语句, 相当于C的 using namespace std; C# 是大小写敏感的。 所有的语句和表达式必须以分号&#xff08;;&#xff09;结尾。 程序的执行从 Main 方法开始。 与 Java 不同的是&#…

保险丝驱动电路·保险丝有什么用应该如何选型详解文章!!!

目录 保险丝基础知识 保险丝常见类型 保险丝功能讲解 保险丝驱动电路 ​​​​​​​ ​​​​​​​ 编写不易&#xff0c;仅供学习&#xff0c;请勿搬运&#xff0c;感谢理解 常见元器件驱动电路文章专栏连接 LM7805系列降压芯片驱动电路降压芯片驱动电…

如何在读博过程中缓解压力

博士生涯充满了挑战和压力&#xff0c;但通过一些实用的方法&#xff0c;我们可以有效地缓解这些压力。以下是我在博士期间采用的一些策略&#xff0c;希望能对正在读博或即将开始博士生涯的你有所帮助。 1. 周末彻底放松 在周末&#xff0c;我尽量避免进行论文写作。这两天…

ue5 替换角色的骨骼网格体和动画蓝图

一开始动画蓝图&#xff0c;骨骼网格体都是用的女性角色 现在把它换成男性 编译 保存 运行 把动画类换成ABP_Manny 进入ABP_Manny中 进入到idle 找到这个拖进来 编译 就变成站着端枪 运行一下&#xff0c;没有问题

西南大学计算机复试该怎么准备?有哪些注意事项?

西南大学计算机专业复试只有面试&#xff01;只要你表现的自信大方&#xff0c;专业知识问题回答的很好&#xff0c;一般都没问题 一、考试内容 复试的考核内容包含以下几个方面&#xff1a; 1.专业素质和能力&#xff08;占复试成绩的60%&#xff09; &#xff08;1&#x…

【UI自动化测试】selenium八种定位方式

&#x1f3e1;个人主页&#xff1a;謬熙&#xff0c;欢迎各位大佬到访❤️❤️❤️~ &#x1f472;个人简介&#xff1a;本人编程小白&#xff0c;正在学习互联网求职知识…… 如果您觉得本文对您有帮助的话&#xff0c;记得点赞&#x1f44d;、收藏⭐️、评论&#x1f4ac;&am…

RDD的相关算子

一&#xff0c;算子的分类 整个DRR算子分为两大类&#xff1a; Transformation&#xff08;转换算子&#xff09;&#xff1a; 返回值&#xff1a;是一个新的DRR 特点&#xff1a;转换算子只是定义数据的处理规则&#xff0c;并不会立刻执行&#xff0c;是lazy&#xff08;…

简单编程实现QT程序黑色主题显示

代码如下 int main(int argc, char *argv[]) {QApplication a(argc, argv);//QSurfaceFormat::setDefaultFormat(QVTKOpenGLStereoWidget::defaultFormat());QPalette darkpalette;a.setStyle(QStyleFactory::create("Fusion"));darkpalette.setColor(QPalette::Wind…

【Redis】简介|优点|使用场景|为什么Redis快

目录 一、简介 二、特性&#xff08;优点&#xff09; 三、使用场景 一、简介 内存中存储数据的中间件&#xff0c;用于数据库&#xff0c;数据缓存&#xff0c;在分布式系统中能够大展拳脚 中间件&#xff1a;应用程序可以直接从 Redis 中获取数据&#xff0c;而不必频繁地…

封装深拷贝方法

前言 在今年的四月份我写了一篇有关深拷贝的博客文章 我与深拷贝_radash 深拷贝-CSDN博客。在该文章中有一个令我感到遗憾的点就是我没有实现一个自己手写的深拷贝。如今我想弥补当初的遗憾&#xff0c;在这篇文章中详细的讲述一下如何手写一个深拷贝方法。 lodash中是如何实…

maven多模块项目编译一直报Failure to find com.xxx.xxx:xxx-xxx-xxx:pom:1.0-SNAPSHOT in问题

工作中项目上因为多版本迭代&#xff0c;需要对不同迭代版本升级版本号&#xff0c;且因为项目工程本身是多模块结构&#xff0c;且依然多个其他模块工程。 在将工程中子模块的pom.xml中版本号使用变量引用父模块中定义的版本号时&#xff0c;一直报Failure to find com.xxx.x…

uniapp 微信小程序 自定义日历组件

效果图 功能&#xff1a;可以记录当天是否有某些任务或者某些记录 具体使用&#xff1a; 子组件代码 <template><view class"Accumulate"><view class"bx"><view class"bxx"><view class"plank"><…

Mysql--基础篇--函数(字符串函数,日期函数,数值函数,聚合函数,自定义函数及与存储过程的区别等)

MySQL提供了丰富的内置函数&#xff0c;涵盖了字符串处理、数值计算、日期和时间操作、聚合统计、控制流等多种功能。这些函数可以帮助你简化SQL查询&#xff0c;提升开发效率。 除了内置函数&#xff0c;MySQL还支持自定义函数&#xff08;User-Defined Functions&#xff09;…

关于Mac中的shell

1 MacOS中的shell 介绍&#xff1a; 在 macOS 系统中&#xff0c;Shell 是命令行与系统交互的工具&#xff0c;用于执行命令、运行脚本和管理系统。macOS 提供了多种 Shell&#xff0c;主要包括 bash 和 zsh。在 macOS Catalina&#xff08;10.15&#xff09;之前&#xff0c…

外卖院长帝恩以专业打法,开启外卖运营新格局

据中国饭店协会数据显示&#xff0c;2023年我国在线餐饮外卖市场规模已达到15254亿元&#xff0c;同比增长36.7%。预计到2027年&#xff0c;我国在线餐饮外卖市场规模有望达到19567亿元&#xff0c;行业渗透率有望达到30.4%。在这一蓬勃发展的行业背后&#xff0c;离不开无数从…