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_exempt
    def 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"})

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

多模态数字人AI产品正在革新金融业,解密头部银行、证券公司都在用的AI工具

在人工智能迅猛发展的时代背景下&#xff0c;金融业正迎来一场深刻的变革。 多模态的人工智能&#xff0c;以其独特的魅力&#xff0c;正在重塑金融行业的格局&#xff0c;为金融服务带来前所未有的新想象。从今年以来行业对AI技术的探索与实践中&#xff0c;AIGC 3D数字人多模…

数据仓库还是数据集市?这俩怎么选?

数据仓库和数据集市作为支持决策分析的两种不同方式&#xff0c;根据各自的特点和优势&#xff0c;有不同的应用场景&#xff0c;今天就来探讨下数据集市和数据仓库该怎么选&#xff1f; 一、数据集市和数据仓库对比 1、数据集市与数据仓库的关系&#xff1a; 1&#xff09;数…

2024年数据分析5大趋势

在快速发展和创新的数据分析领域&#xff0c;2024 年有望成为突破性趋势的一年&#xff0c;这些趋势将重新定义企业从数据中提取洞察的方式。 下文将分析2024 年 5 大数据分析趋势&#xff0c;揭示将塑造数据驱动决策未来的工具和策略。 趋势一&#xff1a;人工智能落地将成为…

AI帮你记住所有密码,你敢把隐私交给它吗?

数字时代的密码管理挑战 在这个信息爆炸的数字时代&#xff0c;每个人都面临着前所未有的密码管理挑战。随着我们在网上进行越来越多的活动&#xff0c;从购物到社交&#xff0c;再到网上银行&#xff0c;所需的密码数量也随之激增。每个账户需要独特且复杂的组合&#xff0c;…

[Meachines] [Medium] MonitorsThree SQLI+Cacti-CMS-RCE+Duplicati权限提升

信息收集 IP AddressOpening Ports10.10.11.30TCP:22&#xff0c;80 $ nmap -p- 10.10.11.30 --min-rate 1000 -sC -sV -Pn PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 8.9p1 Ubuntu 3ubuntu0.10 (Ubuntu Linux; protocol 2.0) | …

springboot牛奶预定系统-计算机设计毕业源码70299

摘要 在当今社会&#xff0c;随着人们对健康和营养需求的不断增长&#xff0c;牛奶作为重要的营养食品备受青睐。然而&#xff0c;传统的牛奶预定方式存在着诸多不便和限制&#xff0c;如需要到实体店购买或电话预定等&#xff0c;导致消费者体验不佳。因此&#xff0c;开发一款…

Windows 局域网IP扫描工具:IPScaner 轻量免安装

IPScaner是一款258KB的工具&#xff0c;具备快捷修改IP、批量扫描、地址计算等功能&#xff0c;自动识别本机IP网段&#xff0c;快速查看IP使用情况&#xff0c;适用于监控维护、企业IT运维等场 软件功能介绍&#xff1a; 1&#xff09;快捷修改本地IP、IP批量扫描、IP地址计算…

基于java校园招聘管理系统的设计与实现

一、环境信息 开发语言&#xff1a;JAVA JDK版本&#xff1a;JDK8及以上 数据库&#xff1a;MySql5.6及以上 Maven版本&#xff1a;任意版本 操作系统&#xff1a;Windows、macOS 开发工具&#xff1a;Idea、Eclipse、MyEclipse 开发框架&#xff1a;SpringbootHTMLjQueryMysq…

后端Node学习项目-项目基础搭建

前言 各位好&#xff0c;我是前端SkyRain。最近为了响应公司号召&#xff0c;开始对后端知识的学习&#xff0c;作为纯粹小白&#xff0c;记录下每一步的操作流程。 项目仓库&#xff1a;https://gitee.com/sky-rain-drht/drht-node 因为写了文档&#xff0c;代码里注释不是很…

Halcon 重写Rectangle2及Arrow

验证目标&#xff1a;验证rotate_image后图像是否变形 获取信息&#xff1a;获取矩形中轴起点&#xff0c;终点&#xff0c;及四角位置信息 应用场景&#xff1a;1&#xff0c;找线找点算子封装后为检测极性指明方向 2&#xff0c;为二次定位提供位置信息 读取原图 read_im…

技术复杂性导致估算不准确?5大对策

技术复杂性引发的估算不准确可能导致成本超出预算&#xff0c;不当的资源分配则可能造成人力浪费或关键任务缺乏必要支持&#xff0c;进而影响客户满意度和市场竞争力&#xff0c;增加项目失败的风险。而有效避免因技术复杂性导致的估算不准确问题&#xff0c;可以显著提升项目…

【动手学电机驱动】STM32-FOC(5)基于 IHM03 的无感 FOC 控制

STM32-FOC&#xff08;1&#xff09;STM32 电机控制的软件开发环境 STM32-FOC&#xff08;2&#xff09;STM32 导入和创建项目 STM32-FOC&#xff08;3&#xff09;STM32 三路互补 PWM 输出 STM32-FOC&#xff08;4&#xff09;IHM03 电机控制套件介绍 STM32-FOC&#xff08;5&…

教程:FFmpeg结合GPU实现720p至4K视频转换

将一个 720p 的视频放大编码到 4K&#xff0c;这样的视频处理在很多业务场景中都会用到。很多视频社交、短视频、视频点播等应用&#xff0c;都会需要通过服务器来处理大量的视频编辑需求。 本文我们会探讨一下做这样的视频处理&#xff0c;最低的 GPU 指标应该是多少。利用开源…

31.7K+ Star!AgentGPT:一个在浏览器中运行的Agent

AgentGPT 简介 AgentGPT[1] 是一个可以让你在浏览器中组装、配置和部署自主AI代理的项目。你可以为你的自定义AI命名,并让它去实现任何你想象中目标。它将尝试通过思考要执行的任务、执行它们并从结果中学习来达成目标。 项目特点 主要特点 自主AI代理:用户可以自定义AI并赋…

革新汽车装配产线:MR30分布式IO模块引领智能制造新时代

在日新月异的汽车制造行业中&#xff0c;每一分每一秒的效率提升都意味着成本的降低与市场竞争力的增强。随着工业4.0时代的到来&#xff0c;智能化、自动化已成为汽车产线升级转型的关键词。在这场技术革命的浪潮中&#xff0c;MR30分布式IO模块以其高效、灵活、可靠的特点&am…

汽车免拆诊断案例 | 2017款凯迪拉克XT5车组合仪表上的指针均失灵

故障现象 一辆2017款凯迪拉克XT5车&#xff0c;搭载LTG 发动机&#xff0c;累计行驶里程约为17.2万km。车主反映&#xff0c;组合仪表上的发动机转速表、车速表、燃油表及发动机冷却液温度表的指针均不指示&#xff0c;但发动机起动及运转正常&#xff0c;且车辆行驶正常。 故…

LeetCode 热题100之二分

关于二分&#xff0c;之前也写过一篇&#xff0c;参考二分Acwing 1.搜索插入位置 思路分析&#xff1a;典型的 二分查找算法&#xff0c;用于在一个已排序的数组中查找目标值的位置。如果找到了目标值&#xff0c;返回其索引&#xff1b;如果没有找到&#xff0c;则返回目标值…

viewerjs实现以图片中心点进行缩放

最近有个需求&#xff0c;使用到了viewerjs对一个图片进行可缩放预览&#xff0c;但是存在一个问题&#xff0c;通过滚轮缩放图片时会导致图片移动到视窗外面。 翻了一下GitHub上的源码&#xff0c;viewerjs滚轮&#xff08;触摸板双指&#xff09;缩放功能是监听了wheel事件&a…

OpenAI大事记;GPT到ChatGPT参数量进化

目录 OpenAI大事记 GPT到ChatGPT参数量进化 OpenAI大事记 GPT到ChatGPT参数量进化 ChatGPT是从初代 GPT逐渐演变而来的。在进化的过程中,GPT系列模型的参数数量呈指数级增长,从初代GPT的1.17亿个参数,到GPT-2的15 亿个参数,再到 GPT-3的1750 亿个参数。模型越来越大,训练…

通过包控制->获取包重新获取之后,需求类型列表不对

龙勤思(2017年11月27日)&#xff1a; 这个类型列表&#xff0c;我在把需求包提交到svn&#xff0c;再新建一个eap&#xff0c;通过包控制->获取包重新获取之后&#xff0c;就变成默认的如下列表了。我从你的原始的eap导出参考数据&#xff0c;再导入到新建的eap&#xff0c…