django vue3实现大文件分段续传(断点续传)

前端环境准备及目录结构:

 npm create vue 并取名为big-file-upload-fontend
通过 npm i  安装以下内容"dependencies": {"axios": "^1.7.9","element-plus": "^2.9.1","js-sha256": "^0.11.0","vue": "^3.5.13"},

在这里插入图片描述

main.js中的内容

import { createApp } from 'vue'
import App from './App.vue'
import ElementPlus from 'element-plus'
import 'element-plus/dist/index.css'
// app.use(ElementPlus)
const app = createApp(App)
app.use(ElementPlus)
app.mount('#app')

App.vue 中的内容:

<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>
</template>
<script setup>
import axios from 'axios'
import {sha256} from 'js-sha256'const uploadFile = ({file}) => {// 每4MB为一个小文件const chunkSize = 4 * 1024 * 1024; // 4MB// 文件总大小const fileSize = file.size;// 分成了多少个片段const chunks = Math.ceil(fileSize / chunkSize);// 保证文件唯一const sha256Promise = sha256(file.name); // sha256的参数只接收字符串// 询问已经上传了几个片段const checkUploadedChunks = () => {return axios.post('http://127.0.0.1:8000/api/check', {sha256Promise: sha256Promise}).then(response => {return response.data; // response.data 就是下边的 uploadedChunks});};return checkUploadedChunks().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)) {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);formData.append('filename', file.name);// 一次只上传一个片段,本次上传完成后才上传下一个const res = await axios.post('http://127.0.0.1:8000/api/upload', formData)}});
};
</script><style >
html, body{height: 100%;width: 100%;background-color: pink;
}
</style>

django后端环境及目录:

django-admin startproject big_file_upload_backend # 创建一个big_file_upload_backend项目
python版本:
Python 3.11.11
pip 需要安装:
Django                        5.0.6 
django-cors-headers           4.6.0  # 用于解决跨域 

在这里插入图片描述

big_file_upload_backend/settings.py 中的配置如下:

MIDDLEWARE = [......'django.contrib.sessions.middleware.SessionMiddleware',"corsheaders.middleware.CorsMiddleware",  # CorsMiddleware一定要在CommonMiddleware之前'django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware', #  注释掉这个'django.contrib.auth.middleware.AuthenticationMiddleware',......
]
# 并在文件最后添加上允许所有跨域
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_HEADERS = ('*')
# 将STATIC_URL = 'statics/' 替换为下边这三行
STATIC_URL = 'statics/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, "../statics"),
]# 完整的setting设置如下:
"""
Django settings for big_file_upload_backend project.Generated by 'django-admin startproject' using Django 4.2.For more information on this file, see
https://docs.djangoproject.com/en/4.2/topics/settings/For the full list of settings and their values, see
https://docs.djangoproject.com/en/4.2/ref/settings/
"""
import os
from pathlib import Path# Build paths inside the project like this: BASE_DIR / 'subdir'.
BASE_DIR = Path(__file__).resolve().parent.parent# Quick-start development settings - unsuitable for production
# See https://docs.djangoproject.com/en/4.2/howto/deployment/checklist/# SECURITY WARNING: keep the secret key used in production secret!
SECRET_KEY = 'django-insecure-%sa^&p^%m3+m0ex%@y%la0(zzt4y4k3l%0=p#tipx-kz6w*#=d'# SECURITY WARNING: don't run with debug turned on in production!
DEBUG = TrueALLOWED_HOSTS = []# Application definitionINSTALLED_APPS = ['django.contrib.admin','django.contrib.auth','django.contrib.contenttypes','django.contrib.sessions','django.contrib.messages','django.contrib.staticfiles',
]MIDDLEWARE = ['django.middleware.security.SecurityMiddleware','django.contrib.sessions.middleware.SessionMiddleware',"corsheaders.middleware.CorsMiddleware",'django.middleware.common.CommonMiddleware',# 'django.middleware.csrf.CsrfViewMiddleware','django.contrib.auth.middleware.AuthenticationMiddleware','django.contrib.messages.middleware.MessageMiddleware','django.middleware.clickjacking.XFrameOptionsMiddleware',
]ROOT_URLCONF = 'big_file_upload_backend.urls'TEMPLATES = [{'BACKEND': 'django.template.backends.django.DjangoTemplates','DIRS': [],'APP_DIRS': True,'OPTIONS': {'context_processors': ['django.template.context_processors.debug','django.template.context_processors.request','django.contrib.auth.context_processors.auth','django.contrib.messages.context_processors.messages',],},},
]WSGI_APPLICATION = 'big_file_upload_backend.wsgi.application'# Database
# https://docs.djangoproject.com/en/4.2/ref/settings/#databasesDATABASES = {'default': {'ENGINE': 'django.db.backends.sqlite3','NAME': BASE_DIR / 'db.sqlite3',}
}# Password validation
# https://docs.djangoproject.com/en/4.2/ref/settings/#auth-password-validatorsAUTH_PASSWORD_VALIDATORS = [{'NAME': 'django.contrib.auth.password_validation.UserAttributeSimilarityValidator',},{'NAME': 'django.contrib.auth.password_validation.MinimumLengthValidator',},{'NAME': 'django.contrib.auth.password_validation.CommonPasswordValidator',},{'NAME': 'django.contrib.auth.password_validation.NumericPasswordValidator',},
]# Internationalization
# https://docs.djangoproject.com/en/4.2/topics/i18n/LANGUAGE_CODE = 'en-us'TIME_ZONE = 'UTC'USE_I18N = TrueUSE_TZ = True# Static files (CSS, JavaScript, Images)
# https://docs.djangoproject.com/en/4.2/howto/static-files/STATIC_URL = 'statics/'
STATICFILES_DIRS = [os.path.join(BASE_DIR, "../statics"),
]# Default primary key field type
# https://docs.djangoproject.com/en/4.2/ref/settings/#default-auto-fieldDEFAULT_AUTO_FIELD = 'django.db.models.BigAutoField'
CORS_ALLOW_CREDENTIALS = True
CORS_ALLOW_ALL_ORIGINS = True
CORS_ALLOW_HEADERS = ('*')

big_file_upload_backend/urls.py中的配置如下:

from django.contrib import admin
from django.urls import path
from big_file_upload_backend.views import checks, uploadurlpatterns = [path('admin/', admin.site.urls),path('api/check', checks),path('api/upload', upload),
]

big_file_upload_backend/views.py中的配置如下:

import json
import os
from django.http import JsonResponse
from big_file_upload_backend import settingsdef checks(request):if request.method == "POST":body = json.loads(request.body.decode("utf-8"))filename = body.get("sha256Promise", None)base_path = settings.STATIC_URL+'record_files/'+filename+'.txt'# base_path = '../statics/record_files/'+filename+'.txt'file_is_exits = os.path.exists(base_path)# 判断文件是否存在,存在则说明之前至少上传过一次if file_is_exits:with open(base_path, 'r') as f:check_list = json.loads(f.readline())else:# 不存在就返回空check_list = []return JsonResponse(check_list, safe=False)def upload(request):if request.method == "POST":# 注意这里用的是request.FILES 因为chunk为文件流形式chunk = request.FILES.get("chunk")# 当前的切片编号chunk_number = request.POST.get("chunkNumber")# 总切片数量chunks_total = int(request.POST.get("chunksTotal"))# 文件名唯一标识sha256_promise = request.POST.get("sha256Promise")# 文件名称filename = request.POST.get("filename")# base_path = '../statics/upload_files/'+sha256_promise # 这样写无效base_path = settings.STATIC_URL + "upload_files/" + sha256_promise  # 必须这样写# record_path中的txt文件用于记录已经上传过的切片record_path = settings.STATIC_URL + "record_files/" + sha256_promise+'.txt'  # 必须这样写os.makedirs(base_path, exist_ok=True)# 后缀名ext = filename.split(".")[-1]# 小切片的文件名称order_file = chunk_number+'.'+extfname = base_path+"/" + order_filewith open(fname, 'wb') as f:for line in chunk:# 将上传的文件写入小切片中,等上传完成后进行合并f.write(line)# 等写完了才做判断chunk_number_int = int(chunk_number)  # 将字符串转成intline_list = [int(chunk_number)]  # 默认先添加一个切片片段if os.path.exists(record_path):with open(record_path, 'r') as f:line_data = f.readline()  # 读取已经上传的小切片if line_data == '':passelse:line_list = json.loads(line_data)  # 将字符串形式的数组转为python数组if chunk_number_int not in line_list:line_list.append(chunk_number_int)  # 如果当前切片号不在已上传的数组中则添加with open(record_path, 'w') as f:f.write(json.dumps(line_list))  # 将已上传的片段列表重新写回记录文件中#  合并小切片片段段if len(line_list) == chunks_total:with open(base_path+"/"+filename, "wb") as f:# 按照升序一个一个合并for num in sorted(line_list):with open(base_path+"/"+str(num)+"."+ext, 'rb') as r:f.write(r.read())# 读取完毕将片段删除,只保留合并后的文件os.remove(base_path+"/"+str(num)+"."+ext)# 返回没啥用check_list = {"chunk_number": chunk_number, "code": 200}return JsonResponse(check_list)

在项目根目录下要新建一个statics目录,且其下边要有两个目录:

record_files
upload_files

最后分别运行前后端项目

前端:npm run dev
后端: python manage.py runserver

点击上传文件,选择一个较大的文件进行上传,可以看到右侧一直再分片上传,上传完成后会在上述两个文件中分别多出两个文件

在这里插入图片描述

如果是上传过程中还可以看到upload_files文件下的小分片中的片段产生和合并过程,也可以在上传到一半时随机关闭浏览器,下次打开重新上传,则会跳过之前上传的继续进行上传。上传完成后的效果:

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.rhkb.cn/news/502159.html

如若内容造成侵权/违法违规/事实不符,请联系长河编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

黑马跟学.苍穹外卖.Day01

黑马跟学.苍穹外卖.Day01 苍穹外卖-day01课程内容1. 软件开发整体介绍1.1 软件开发流程1.2 角色分工1.3 软件环境 2. 苍穹外卖项目介绍2.1 项目介绍2.2 产品原型2.3 技术选型 3. 开发环境搭建3.1 前端环境搭建3.2 后端环境搭建3.2.1 熟悉项目结构3.2.2 Git版本控制3.2.3 数据库…

基于动力学的MPC控制器设计盲点解析

文章目录 Apollo MPC控制器的设计架构误差模型和离散化预测模型推导目标函数和约束设计优化求解优化OSQP求解器参考文献 Apollo MPC控制器的设计架构 误差模型和离散化 状态变量和控制变量 1、Apollo MPC控制器中状态变量主要有如下6个 matrix_state_ Matrix::Zero(basic_stat…

2025/1/1 路由期末复习作业二

呼呼呼祝大家元旦节快乐啦&#xff01;&#xff08;我顶着我超重的黑眼圈说&#xff09; 昨天一个人在寝室一边吃泡面&#xff0c;一边看步步惊心&#xff0c;一边吃一边哭呜呜呜呜呜若曦为什么不和八爷在一起好好爱&#xff0c;就因为他不当皇帝蛮&#xff01;难测最是帝王心…

面试题解,JVM中的“类加载”剖析

一、JVM类加载机制说一下 其中&#xff0c;从加载到初始化就是我们的类加载阶段&#xff0c;我们逐一来分析 加载 “加载 loading”是整个类加载&#xff08;class loading&#xff09;过程的一个阶段&#xff0c;加载阶段JVM需要完成以下 3 件事情&#xff1a; 1&#xff0…

后端开发-Maven

环境说明&#xff1a; windows系统&#xff1a;11版本 idea版本&#xff1a;2023.3.2 Maven 介绍 Apache Maven 是一个 Java 项目的构建管理和理解工具。Maven 使用一个项目对象模型&#xff08;POM&#xff09;&#xff0c;通过一组构建规则和约定来管理项目的构建&#xf…

UML之泛化、特化和继承

在UML&#xff08;统一建模语言&#xff09;中&#xff0c;泛化&#xff08;Generalization&#xff09;和特化&#xff08;Specialization&#xff09;是面向对象思想中继承&#xff08;Inheritance&#xff09;关系的重要概念&#xff0c;它们描述类与类&#xff08;或用例与…

【时时三省】(C语言基础)常见的动态内存错误2

山不在高&#xff0c;有仙则名。水不在深&#xff0c;有龙则灵。 ----CSDN 时时三省 对非动态开辟空间内存使用free释放 示例&#xff1a; 这个arr数组是在栈上的 *p指向的就是arr 对非动态空间也用了free ferr只能在动态开辟空间使用 使用free释放一块动态开辟空间的一部分…

leecode718.最长重复子数组

二维空间版 class Solution { public:int findLength(vector<int>& nums1, vector<int>& nums2) {int mnums1.size(),nnums2.size();vector<vector<int>> dp(m,vector<int>(n));int result0;for(int i0;i<m;i)if(nums1[i]nums2[0]){…

「Mac畅玩鸿蒙与硬件54」UI互动应用篇31 - 滑动解锁屏幕功能

本篇教程将实现滑动解锁屏幕功能&#xff0c;通过 Slider 组件实现滑动操作&#xff0c;学习事件监听、状态更新和交互逻辑的实现方法。 关键词 滑动解锁UI交互状态管理动态更新事件监听 一、功能说明 滑动解锁屏幕功能包含以下功能&#xff1a; 滑动解锁区域&#xff1a;用…

电子应用设计方案86:智能 AI背景墙系统设计

智能 AI 背景墙系统设计 一、引言 智能 AI 背景墙系统旨在为用户创造一个动态、个性化且具有交互性的空间装饰体验&#xff0c;通过融合先进的技术和创意设计&#xff0c;提升室内环境的美观度和功能性。 二、系统概述 1. 系统目标 - 提供多种主题和风格的背景墙显示效果&…

基于物联网疫苗冷链物流监测系统设计

1. 项目开发背景 随着全球对疫苗运输要求的提高&#xff0c;特别是针对温度敏感型药品&#xff08;如疫苗&#xff09;的冷链管理&#xff0c;如何保证疫苗在运输过程中的温度、湿度、震动等环境因素的稳定性已成为亟需解决的问题。疫苗运输过程中&#xff0c;任何温度或湿度的…

Trimble天宝X9三维扫描仪为建筑外墙检测提供了全新的解决方案【沪敖3D】

随着城市化进程的快速推进&#xff0c;城市高层建筑不断增多&#xff0c;对建筑质量的要求也在不断提高。建筑外墙检测&#xff0c;如平整度和垂直度检测&#xff0c;是衡量建筑质量的重要指标之一。传统人工检测方法不仅操作繁琐、效率低下&#xff0c;还难以全面反映墙体的真…

瑞吉外卖项目学习笔记(十)修改套餐、删除套餐、起售和停售套餐

瑞吉外卖项目学习笔记(一)准备工作、员工登录功能实现 瑞吉外卖项目学习笔记(二)Swagger、logback、表单校验和参数打印功能的实现 瑞吉外卖项目学习笔记(三)过滤器实现登录校验、添加员工、分页查询员工信息 瑞吉外卖项目学习笔记(四)TableField(fill FieldFill.INSERT)公共字…

Python 实时获取Linux服务器信息

在进行服务器监控、运维管理时&#xff0c;实时获取服务器信息至关重要。特别是在 Linux 环境下&#xff0c;我们常常需要获取系统的运行状态、资源占用情况以及硬件信息。如果你是运维人员、开发者或是正在做自动化运维任务的人&#xff0c;那么如何高效地实时获取 Linux 服务…

MATLAB程序转C# WPF,dll集成,混合编程

工作中遇到一个需求&#xff0c;有一部分算法的代码需要MATLAB来进行处理&#xff0c;而最后需要集成到C#中的wpf项目中去&#xff0c;选择灵活性更高的dll&#xff0c;去进行集成。&#xff08;可以简单理解为&#xff1a;将MATLAB的函数&#xff0c;变为C#中类的函数成员&…

「Mac畅玩鸿蒙与硬件49」UI互动应用篇26 - 数字填色游戏

本篇教程将带你实现一个数字填色小游戏&#xff0c;通过简单的交互逻辑&#xff0c;学习如何使用鸿蒙开发组件创建趣味性强的应用。 关键词 UI互动应用数字填色动态交互逻辑判断游戏开发 一、功能说明 数字填色小游戏包含以下功能&#xff1a; 数字选择&#xff1a;用户点击…

深入理解 pytest Fixture 方法及其应用

在 Python 自动化测试领域&#xff0c;pytest 是当之无愧的王者。提到 pytest&#xff0c;不得不说它的一大核心功能——Fixture。Fixture 的强大&#xff0c;让复杂的测试流程变得井井有条&#xff0c;让测试代码更加灵活和可复用。 那么&#xff0c;pytest 的 Fixture 究竟是…

【AI编辑器】Cursor与DeepSeek模型的集成:提升开发效率的新选择

目录 一、为什么选择DeepSeek模型 1.1 模型参数与训练 1.2 技术创新 1、FP8格式介绍 2、FP8混合精度训练的优势 3、FP8混合精度训练的技术要点 4、FP8混合精度训练的应用与挑战 1.3 性能表现 1.4 应用与部署 1.5 争议与前景 二、注册DeepSeek账号并获取API Key 三、…

什么情况会导致JVM退出?

大家好&#xff0c;我是锋哥。今天分享关于【什么情况会导致JVM退出?】面试题。希望对大家有帮助&#xff1b; 什么情况会导致JVM退出? 1000道 互联网大厂Java工程师 精选面试题-Java资源分享网 JVM&#xff08;Java Virtual Machine&#xff09;在不同情况下可能会退出&am…

软件工程实验-实验2 结构化分析与设计-总体设计和数据库设计

一、实验内容 1. 绘制工资支付系统的功能结构图和数据库 在系统设计阶段&#xff0c;要设计软件体系结构&#xff0c;即是确定软件系统中每个程序是由哪些模块组成的&#xff0c;以及这些模块相互间的关系。同时把模块组织成良好的层次系统&#xff1a;顶层模块通过调用它的下层…