vue3 + element-plus 的 upload + axios + django 文件上传并保存

之前在网上搜了好多教程,一直没有找到合适自己的,要么只有前端部分没有后端,要么就是写的不是很明白。所以还得靠自己摸索出来后,来此记录一下整个过程。

  • 其实就是不要用默认的 action,要手动实现上传方式 http-request,然后再传给后端进行各种操作了
    • 这里隐藏了文件展示列表
    • 展示了上传文件的个数
    • 文件去重上传
    • 也对上传文件的格式做了限制
    • 在点击创建的时候 progress 会随着上传进度动态变化

环境安装什么的就不讲了,直接上代码好吧,这个是样式图

这是vue3代码

<template><el-upload class="upload-demo form-item" v-model:file-list="fileList" drag multiple :http-request="httpRequest" :show-file-list="false" auto-upload="false" :accept=upload_accept><el-icon class="el-icon--upload"><upload-filled /></el-icon><div class="el-upload__text">拖拽 / 点击上传文件 ( zip, jpg, png ……)</div><template #tip><div class="el-upload__tip">已上传 {{ fileListLength }} 个文件</div></template></el-upload><el-progress :percentage="progress.curr" :color="progress.color" /><el-button type="info" class="btn" @click="removeFile">清空文件</el-button><el-button type="primary" class="btn" @click="create">创建</el-button>
</template><script setup lang="ts">
import { ref, watch } from "vue";
import http from "@/utils/axios/index";
import { UploadFilled } from '@element-plus/icons-vue';
import { ElMessage } from 'element-plus';const public_elmsg_success = (msg: string) => {ElMessage({ type: 'success', duration: 1000, showClose: true, message: msg })
};const public_elmsg_warning = (msg: string) => {ElMessage({ type: 'warning', duration: 1000, showClose: true, message: msg })
};const public_elmsg_error = (msg: string) => {ElMessage({ type: 'error', duration: 1000, showClose: true, message: msg })
};const upload_accept = ref(".JPG,.PNG,.JPEG,.PCD,.MP4,.AVI,.DAT,.DVR,.VCD,.MOV,.SVCD,.VOB,.DVD,.DVTR,.DVR,.BBC,.EVD,.FLV,.RMVB,.WMV,.MKV,.3GP,.ZIP"); // 限制了上传文件的格式 大写后缀
const upload_lower = ref(upload_accept.value.split(',').map((item: any) => item.toLowerCase())); // 限制上传文件的格式 小写后缀
const fileList: any = ref([]);
const fileList1: any = ref([]);
const fileListLength = ref(0);const progress = ref({ "curr": 0, "color": "orange" })watch(fileList1, (newVal, oldVal) => {console.log(newVal, oldVal)fileListLength.value = newVal.value;fileListLength.value = newVal.length;
}, { immediate: true, deep: true });const httpRequest = (options: any) => {let nameList: Array<any> = [];fileList1.value.forEach((item: any) => {nameList.push(item.name);});const file_suffix = options.file.name.split(".");if (!upload_lower.value.includes(`.${file_suffix[file_suffix.length - 1]}`)) {public_elmsg_warning(`文件 ${options.file.name} 格式不正确`);return;}if (nameList.includes(options.file.name)) { }else {fileList1.value.push(options.file)}fileList.value = fileList1.value;
}const removeFile = () => {fileList.value = [];fileList1.value = [];progress.value.curr = 0;
}const create = () => {const formData = new FormData()fileList1.value.forEach((file: any) => {console.log(file)formData.append('files', file)})http.post("task/create/", formData, {headers: { "Content-Type": "multipart/form-data" }, onUploadProgress(progressEvent: any) {progress.value.curr = Math.round((progressEvent.loaded * 100) / progressEvent.total)if (progress.value.curr == 100) { progress.value.color = 'green' }else { progress.value.color = 'orange' }},}).then((res: any) => {if (res.code == 0) {public_elmsg_success("任务创建成功")}else { public_elmsg_error(res.msg) }});
}
</script>

v3版本的 djagno 代码

from loguru import logger
from django.http.response import JsonResponse
from django.views.decorators.csrf import csrf_exempt@csrf_exemptdef create_task(request):files = request.FILES.getlist('files')for fit in files:logger.info(f"name: {fit.name} size: {round(fit.size/ 1024 / 1024 / 1024, 5)} G")# 保存文件#  with open(f"{os.sep.join(['.', fit['name']])}", mode="wb") as f:#         f.write(fit)return JsonResponse({"code": 0, "msg": "success"})

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

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

相关文章

更改Ubuntu22.04锁屏壁纸

更改Ubuntu22.04锁屏壁纸 sudo apt install gnome-shell-extensions gnome-shell-extension-manager安装Gnome Shell 扩展管理器后&#xff0c;打开“扩展管理器”并使用搜索栏找到“锁屏背景”扩展

SDL打开YUV视频

文章目录 问题1&#xff1a;如何控制帧率&#xff1f;问题2&#xff1a;如何触发退出事件&#xff1f;问题3&#xff1a;如何实时调整视频窗口的大小问题4&#xff1a;YUV如何一次读取一帧的数据&#xff1f; 问题1&#xff1a;如何控制帧率&#xff1f; 单独用一个子线程给主线…

SQL server 中 CROSS APPLY的使用

CROSS APPLY 是 SQL Server 中的一个操作符&#xff0c;用于将一个表表达式&#xff08;如子查询、函数等&#xff09;与外部表进行连接。CROSS APPLY 类似于 INNER JOIN&#xff0c;但它允许你在一个查询中多次引用外部表的行&#xff0c;并且可以动态地生成结果集。 基本语法…

【算法】Floyd多源最短路径算法

目录 一、概念 二、思路 三、代码 一、概念 在前面的学习中&#xff0c;我们已经接触了Dijkstra、Bellman-Ford等单源最短路径算法。但首先我们要知道何为单源最短路径&#xff0c;何为多源最短路径 单源最短路径&#xff1a;从图中选取一点&#xff0c;求这个点到图中其他…

纯C++信号槽使用Demo (sigslot 库使用)

sigslot 库与QT的信号槽一样&#xff0c;通过发送信号&#xff0c;触发槽函数&#xff0c;信号槽不是QT的专利&#xff0c;早在2002年国外的一小哥用C写了sigslot 库&#xff0c;简单易用&#xff1b; 该库的官网&#xff08;喜欢阅读的小伙伴可以仔细研究&#xff09;&#xf…

【路径规划】PID搜索算法PSA求解UAV路径规划

摘要 本文研究了基于PID搜索算法&#xff08;PID Search Algorithm, PSA&#xff09;求解无人机&#xff08;UAV&#xff09;路径规划问题。通过引入PID控制思想来控制路径生成过程&#xff0c;使得无人机可以避开障碍物并在复杂地形中寻找最优路径。实验结果表明&#xff0c;…

【大数据学习 | kafka高级部分】kafka的数据同步和数据均衡

1. 数据同步 通过上图我们发现每个分区的数据都不一样&#xff0c;但是三个分区对外的数据却是一致的 这个时候如果第二个副本宕机了 但是如果是leader副本宕机了会发生什么呢&#xff1f; 2. 数据均衡 在线上程序运行的时候&#xff0c;有的时候因为上面副本的损坏&#xff…

java:使用Multi-Release Jar改造Java 1.7项目增加module-info.class以全面合规Java 9模块化规范

common-java是一个我维护了好多年的一个基础项目,编译目标为Java 1.7 现在整个团队的项目要做Java 9以上的技术迁移准备,就需要对这个在内部各项目中被广泛引用的基础项目进行改造,以适合Java 9的模块化规范。 Automatic-Module-Name Java 9的模块化规范(即Java Platform Mod…

二叉树的前中后序遍历

前序遍历:中左右 中序遍历:左中右 后序遍历:左右中 递归法:三种遍历方式代码结构相似&#xff0c;需要搞清楚三个内容:递归函数的返回值&#xff0c;递归函数传递的参数以及递归函数结束的条件 代码随想录 迭代法:需要用栈实现&#xff0c;前序和后序类似&#xff0c;中序…

如何一步步实现api接入JD平台通过url获取item get商品详情字段信息

以下是一步步实现通过 API 接入京东&#xff08;JD&#xff09;平台并使用 URL 获取商品详情&#xff08;Item Get&#xff09;字段信息的大致步骤&#xff1a; 一、注册成为京东开发者并获取 API 权限 注册开发者账号 访问京东api文档&#xff0c;点击注册按钮&#xff0c;按照…

Ubuntu笔记-auto remove

apt autoremove确实是一个非常有用的命令&#xff0c;它用于自动删除系统中不再需要的依赖包。这些依赖包通常是在安装某些软件时自动安装的附加包&#xff0c;而当这些软件被卸载后&#xff0c;这些依赖包也就失去了作用。 然而&#xff0c;许多博客和用户提醒说 apt autorem…

机器视觉基础—双目相机

机器视觉基础—双目相机与立体视觉 双目相机概念与测量原理 我们多视几何的基础就在于是需要不同的相机拍摄的同一个物体的视场是由重合的区域的。通过下面的这种几何模型的目的是要得到估计物体的长度&#xff0c;或者说是离这个相机的距离。&#xff08;深度信息&#xff09…

C++继承(图文非常详细)

继承的概念 1.什么是继承 1.简单定义 我们来看一下下面这串代码注意其中的两个类father 和 son using namespace std; #include<iostream> class father { public:void definity(){cout << "father" << endl;} protected:int tall 180;int age …

解决PyQt5多线程报错:QThread: Destroyed while thread is still running

在使用PyQt5进行多线程开发时&#xff0c;许多初学者会遇到一个常见的问题&#xff1a;程序在运行时没有任何明显的错误信息&#xff0c;但却在终端中报出QThread: Destroyed while thread is still running的警告。而在PyCharm等IDE中&#xff0c;只会看到Process finished wi…

Python中的数据类(dataclass):简化类的定义与数据管理的全面指南

解锁Python编程的无限可能:《奇妙的Python》带你漫游代码世界 《Python OpenCV从菜鸟到高手》带你进入图像处理与计算机视觉的大门! Python 3.7引入的数据类(dataclass)极大地简化了类的定义,尤其在处理数据管理任务时。数据类自动生成__init__、__repr__等方法,帮助开…

详细介绍MySQL、Mongo、Redis等数据库的索引

MySQL 索引 概念与类型 MySQL 索引是一种数据结构&#xff0c;用于快速查找数据库中的数据。它就像一本书的目录&#xff0c;通过索引可以快速定位到需要的数据行&#xff0c;而不必全表扫描。主要的索引类型包括 B - Tree 索引&#xff08;默认索引类型&#xff09;、哈希索引…

torch.full函数介绍

torch.full 是 PyTorch 中用于创建一个具有指定形状、填充值和数据类型的张量的函数。它非常适用于需要初始化特定数值的张量的情况,比如将所有元素填充为一个常量值。 函数定义 torch.full(size, fill_value, *, dtype=None, layout=torch.strided, device=None, requires_…

Unity自动打包——Shell交互

Unity 无论是测试还是上线都需要打包&#xff0c;而每次打包我们还要打各种平台&#xff08;安卓、Ios、WebGL、Windows…&#xff09;,有可能不同的打包时机还要有不同的配置项&#xff0c;这种工作枯燥、繁琐且易错&#xff0c;为了解决这一困扰就想到了能不能做一个工具来专…

NLP自然语言处理:深入探索Self-Attention——自注意力机制详解

NLP自然语言处理&#xff1a;深入探索Self-Attention——自注意力机制详解 在自然语言处理&#xff08;NLP&#xff09;领域&#xff0c;自注意力机制&#xff08;Self-Attention&#xff09;已经成为一种革命性的技术&#xff0c;特别是在Transformer模型及其各种变种中得到了…

Tomcat中如何指定JDK版本

在Tomcat中指定JDK版本可以通过设置环境变量或修改启动脚本来实现。以下是两种常见的方法&#xff1a; 方法一&#xff1a;通过环境变量 设置JAVA_HOME环境变量&#xff1a; 打开“控制面板” -> “系统和安全” -> “系统” -> “高级系统设置”。点击“环境变量”按…