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

  • 其实就是不要用默认的 action,要手动实现上传方式 http-request,然后再传给后端进行各种操作了

    • 这里隐藏了文件展示列表
    • 展示了上传文件的个数
    • 文件去重上传
    • 也对上传文件的格式做了限制
    • 在点击创建的时候 progress 会随着上传进度动态变化

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

这是vue3代码

 1 <template>
2 <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>
3 <el-icon class="el-icon--upload"><upload-filled /></el-icon>
4 <div class="el-upload__text">拖拽 / 点击上传文件 ( zip, jpg, png ……)</div>
5 <template #tip>
6 <div class="el-upload__tip">已上传 {{ fileListLength }} 个文件</div>
7 </template>
8 </el-upload>
9 <el-progress :percentage="progress.curr" :color="progress.color" />
10 <el-button type="info" class="btn" @click="removeFile">清空文件</el-button>
11 <el-button type="primary" class="btn" @click="create">创建</el-button>
12 </template>
13
14 <script setup lang="ts">
15 import { ref, watch } from "vue";
16 import http from "@/utils/axios/index";
17 import { UploadFilled } from '@element-plus/icons-vue';
18 import { ElMessage } from 'element-plus';
19
20
21 const public_elmsg_success = (msg: string) => {
22 ElMessage({ type: 'success', duration: 1000, showClose: true, message: msg })
23 };
24
25 const public_elmsg_warning = (msg: string) => {
26 ElMessage({ type: 'warning', duration: 1000, showClose: true, message: msg })
27 };
28
29 const public_elmsg_error = (msg: string) => {
30 ElMessage({ type: 'error', duration: 1000, showClose: true, message: msg })
31 };
32
33 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"); // 限制了上传文件的格式 大写后缀
34 const upload_lower = ref(upload_accept.value.split(',').map((item: any) => item.toLowerCase())); // 限制上传文件的格式 小写后缀
35 const fileList: any = ref([]);
36 const fileList1: any = ref([]);
37 const fileListLength = ref(0);
38
39 const progress = ref({ "curr": 0, "color": "orange" })
40
41
42 watch(fileList1, (newVal, oldVal) => {
43 console.log(newVal, oldVal)
44 fileListLength.value = newVal.value;
45 fileListLength.value = newVal.length;
46 }, { immediate: true, deep: true });
47
48 const httpRequest = (options: any) => {
49 let nameList: Array<any> = [];
50 fileList1.value.forEach((item: any) => {
51 nameList.push(item.name);
52 });
53 const file_suffix = options.file.name.split(".");
54 if (!upload_lower.value.includes(`.${file_suffix[file_suffix.length - 1]}`)) {
55 public_elmsg_warning(`文件 ${options.file.name} 格式不正确`);
56 return;
57 }
58 if (nameList.includes(options.file.name)) { }
59 else {
60 fileList1.value.push(options.file)
61 }
62 fileList.value = fileList1.value;
63 }
64
65 const removeFile = () => {
66 fileList.value = [];
67 fileList1.value = [];
68 progress.value.curr = 0;
69 }
70
71
72 const create = () => {
73 const formData = new FormData()
74 fileList1.value.forEach((file: any) => {
75 console.log(file)
76 formData.append('files', file)
77 })
78
79 http.post("task/create/", formData, {
80 headers: { "Content-Type": "multipart/form-data" }, onUploadProgress(progressEvent: any) {
81 progress.value.curr = Math.round((progressEvent.loaded * 100) / progressEvent.total)
82 if (progress.value.curr == 100) { progress.value.color = 'green' }
83 else { progress.value.color = 'orange' }
84 },
85 }).then((res: any) => {
86 if (res.code == 0) {
87 public_elmsg_success("任务创建成功")
88 }
89 else { public_elmsg_error(res.msg) }
90 }
91 );
92 }
93 </script>

v3版本的 djagno 代码

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

还有什么更好的方法 ,欢迎大家讨论哇

vue3 + element-plus 的 upload + axios + django 文件上传并保存的更多相关文章

  1. python_way day21 Django文件上传Form方式提交,原生Ajax提交字符处啊,Django文件上传之原生Ajax方式、jQuery Ajax方式、iframe方式,Django验证码,抽屉示例,

    python_way day21 1.Django文件上传至Form方式 2.原生Ajax文件上传提交表单 使用原生Ajax好处:不依赖jquery,在发送一个很小的文件或者字符串的时候就可以用原生A ...

  2. django文件上传、图片验证码、抽屉数据库设计

    1.Django文件上传之Form方式 settings.py, ALLOWED_HOSTS = ['*'] INSTALLED_APPS = [ 'django.contrib.admin', 'd ...

  3. vue+axios+elementUI文件上传与下载

    vue+axios+elementUI文件上传与下载 Simple_Learn 关注  0.5 2018.05.30 10:20 字数 209 阅读 15111评论 4喜欢 6 1.文件上传 这里主要 ...

  4. axios+FormData文件上传

    axios+FormData文件上传 原理:FormData上传 创建一个FormData对象,将得到的文件流对象放在FormData内,然后使用axios上传 注意: 1.请求头设置 headers ...

  5. Django文件上传下载与富文本编辑框

    django文件上传下载 上传 配置settings.py # 设定文件的访问路径,如:访问http://127.0.0.1:8000/media/就可以获取文件 MEDIA_URL = '/medi ...

  6. WordPress NextGEN Gallery ‘upload.php’任意文件上传漏洞

    漏洞名称: WordPress NextGEN Gallery ‘upload.php’任意文件上传漏洞 CNNVD编号: CNNVD-201306-259 发布时间: 2013-06-20 更新时间 ...

  7. ASP.NET Core单文件和多文件上传并保存到服务端

    前言: 在我们日常开发中,关于图片,视频,音频,文档等相关文件上传并保存到服务端中是非常常见的一个功能,今天主要是把自己在开发中常用的两种方式记录下来方便一下直接使用,并且希望能够帮助到有需要的同学! ...

  8. vue+element UI + axios封装文件上传及进度条组件

    1.前言 之前在做项目的时候,需要实现一个文件上传组件并且需要有文件上传进度条,现将之前的实现过程简单记录一下,希望可以帮助到有需要的人. 项目用的是Vue框架,UI库使用的是element UI,前 ...

  9. django文件上传和序列化

    django实现文件上传 使用form表单上传文件 html页面 <html lang="en"> <head> <meta charset=&quo ...

  10. django文件上传

    -------------------上传图片-------------------1.model中定义属性类型为models.ImageField类型 pic=models.ImageField(u ...

随机推荐

  1. 一文教你理解Kafka offset

    日常开发中,相信大家都对 Kafka 有所耳闻,Kafka 作为一个分布式的流处理平台,一般用来存储和传输大量的消息数据.在 Kafka 中有三个重要概念,分别是 topic.partition 和 ...

  2. Python基础—— 模块介绍、模块的使用、包介绍、 包的使用、软件开发目录规范

    文章目录 一 模块介绍 二 模块的使用 2.1 import语句 2.2 from-import 语句 2.3 其他导入语法(as) 2.4 循环导入问题 2.5 搜索模块的路径与优先级 2.6 区分 ...

  3. Ubuntu 14.04解决登录界面无限循环的方法

    在Ubuntu下配置Android的环境时,想像在Windows中那样在终端中直接启动adb,以为Linux和Windows一样,将adb的路径添加到环境变量中,于是将adb的路径也export到/e ...

  4. Stable Diffusion

     Stable Diffusion  ...using diffusers Stable Diffusion is a text-to-image latent diffusion model cre ...

  5. mol 文件格式简单解析(v2000)

    前言 .mol 文件是常见的化学文件格式,主要包含分子的坐标.分子间的键等数据. 示例文件 下面是一个水分子的 .mol 文件 H2O APtclcactv05052315543D 0 0.00000 ...

  6. 人均瑞数系列,瑞数 6 代 JS 逆向分析

    声明 本文章中所有内容仅供学习交流使用,不用于其他任何目的,不提供完整代码,抓包内容.敏感网址.数据接口等均已做脱敏处理,严禁用于商业用途和非法用途,否则由此产生的一切后果均与作者无关! 本文章未经许 ...

  7. 实用的命令行终端增强软件:Tabby

    还是那句话:出众的软件有很多,适合自己的才是最好的. 一.软件介绍 Tabby是一个开源免费软件,支持Windows.macOS和Linux系统.它提供了一个高度可定制的终端界面,可以通过多种方式添加 ...

  8. HTTP请求中浏览器的缓存机制(转)

    摘要:在Web开发过程中,我们可能会经常遇到浏览器缓存的问题.本文作者详细解释了浏览器缓存的机制,帮助读者更深层次的认识浏览器的缓存. 流程 当资源第一次被访问的时候,HTTP头部如下 (Reques ...

  9. Dom 的理解和操作

    dom 文本对象模型 12种节点类型 一.node类型  js中所有节点类型都继承自node类型 每个节点都有一个nodeType属性,表明节点类型:判断节点类型,if(somenode.nodeTy ...

  10. CentOS 7替换默认软件源

    安装CentOS 7后,默认源在国外,可以替换为国内的源以提升访问速度 参考https://mirrors.ustc.edu.cn/help/centos.html sudo vi /etc/yum. ...