vue3+elementplus+flask 文件夹上传

 <div><input class="fileuploadclass" title="请选择文件夹" ref="file" id="submit" type="file"multiple name="" webkitdirectory @change="folderModelOn"><el-button type="primary" @click="onUpload" style="margin-left: 10%">证书密钥上传</el-button><ul style="margin-left: 10%; list-style-type: disc;color: #3A3A8AFF" ><li v-for="file in files_d" :key="file.name"><span> {{ file.name }}</span></li></ul></div>

input 加入这个属性webkitdirectory即可实现选择文件夹上传:

css 

/* 隐藏原生文件选择按钮 */
.fileuploadclass {opacity: 0;width: 0;height: 0;
}

在子组件里先选择文件夹,然后在父组件里新建完成后调用

const folderModelOn = (e) => {let files = e.target.files;let formData = new FormData();for (let i = 0; i < files.length; i++) {  // 每个file append到formdata里let file1 = files[i];let isor = falseif (file1.name.includes('.pem')) {for (let [name, file] of formData.entries()) {if(file.name.includes(file1.name)){isor = true}}if(isor === false){formData.append('file', file1);}} else {// if (formData.size ===0){//// }//  // 重置文件选择输入// document.querySelector('input[type="file"]').value = '';//// // 或者直接设置files为空数组// files = [];ElMessage({message: '上传文件必须是.pem的文件',type: 'warning',})}}formdfileata.push({formdata:formData})// 重置文件选择输入document.querySelector('input[type="file"]').value = '';for (let [name, file] of formData.entries()) {console.log(name, file);let incl  = files_d.value.some((item) => item.name.includes(file.name));if(!incl){files_d.value.push({name:file.name})}}}
const subData = async (row) => {console.log('提交', row)let re = JSON.parse(JSON.stringify(row))console.log('提交', employeeRow)if (re.draw_name == "新增") {await api.postshopInfos(JSON.parse(JSON.stringify(row))).then(item => {console.log(item)if (item.code === 200) {let order_id = item.data['id']console.log('获取订单id::',order_id)console.log('子组件::',proxy.$refs.drawer.formdfileata[0].formdata)ElMessage({showClose: true,message: item.msg,type: 'success',})// let formdatas = proxy.$refs.drawer.formdfileata[0].formdata// for (let [name, file] of formdatas.entries()) {//   console.log(name, file);//// }let upurl = "/upload"+'?'+"shop_id="+order_idrequest({method: 'POST',url: upurl,data: proxy.$refs.drawer.formdfileata[0].formdata,headers: {'Content-Type': 'multipart/form-data'}}).then(function (res) {if (res.code == 200) {ElMessage({message: '文件夹上传成功',type: 'success',})}})drawer.value.isClose()} else {ElMessage.error('添加失败')}})} else {await api.putshopInfos(JSON.parse(JSON.stringify(row))).then(item => {console.log(item)if (item.code === 200) {ElMessage({showClose: true,message: item.msg,type: 'success',})drawer.value.isClose()let order_id = item.data['id']let upurl = "/upload"+'?'+"shop_id="+order_idrequest({method: 'POST',url: upurl,data: proxy.$refs.drawer.formdfileata[0].formdata,headers: {'Content-Type': 'multipart/form-data'}}).then(function (res) {if (res.code == 200) {ElMessage({message: '文件夹上传成功',type: 'success',})}})} else {ElMessage.error('修改失败')}})}getshopList(config)}

flask 后端:

@users_bp.route("/upload", methods=["POST"])
def upload_file():print("-----------------------")if request.method == 'POST':shop_id = request.args.get('shop_id', '')BASE_DIR = os.path.dirname(os.path.realpath(sys.argv[0]))if shop_id != "":shop_path  = 'utils/cert/'+str(shop_id)dstpath = os.path.join(BASE_DIR, shop_path)if not os.path.exists(dstpath):os.makedirs(dstpath)print(f"文件夹 {dstpath} 创建成功!")else:print(f"文件夹 {dstpath} 已经存在。")ts = request.files.getlist("file")obj = ShopInfo.query.filter(ShopInfo.id==int(shop_id)).first()if len(ts)>0:for item in ts:secure_filename(item.filename)file = item.filename.split('/')[1]item.save(dstpath +'/'+ file)if 'key' in file:obj.user_account = dstpath + '/' + filedb.session.commit()return jsonify({"code": "200","data": "","msg": "文件上传成功"})

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

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

相关文章

冒泡排序/鸡尾酒排序

冒泡排序 冒泡排序&#xff08;Bubble Sort&#xff09;是一种简单的排序算法&#xff0c;它通过多次交换相邻元素的位置来实现排序。它的基本思想是从数组的第一个元素开始&#xff0c;比较相邻的两个元素&#xff0c;如果它们的顺序错误&#xff0c;则交换它们的位置。重复进…

蓝桥杯每日一题20233.10.10

题目描述 回文日期 - 蓝桥云课 (lanqiao.cn) 题目分析 对于此题&#xff0c;我们最先想到的是暴力解法&#xff0c;将每一种情况经行循环查找&#xff0c;在查找的过程中记录下答案&#xff0c;回文日期就是字符串判断回文&#xff0c;ABABBABA型回文日期可以将回文经行特判…

JVM源码剖析之Thread类中sleep方法

版本信息&#xff1a; jdk版本&#xff1a;jdk8u40 写在前面&#xff1a; 大部分的Java程序员知道让线程睡眠的方法是Thread.sleep方法&#xff0c;而这个方法是一个native方法&#xff0c;让很多想知道底层如何让线程睡眠的程序员望而却步。所以笔者特意写在这篇文章&#xf…

openGauss学习笔记-96 openGauss 数据库管理-访问外部数据库-file_fdw

文章目录 openGauss学习笔记-96 openGauss 数据库管理-访问外部数据库-file_fdw96.1 使用file_fdw96.2 注意事项 openGauss学习笔记-96 openGauss 数据库管理-访问外部数据库-file_fdw openGauss的fdw实现的功能是各个openGauss数据库及远程服务器&#xff08;包括数据库、文件…

沪深300期权一个点多少钱?

经中国证监会批准&#xff0c;深圳证券交易所于2019年12月23日上市嘉实沪深300ETF期权合约品种。该产品是以沪深300为标的物的嘉实沪深300ETF交易型指数基金为标的衍生的标准化合约&#xff0c;下文介绍沪深300期权一个点多少钱?本文来自&#xff1a;期权酱 一、沪深300期权涨…

PDF编辑和OCR文字识别工具ABBYY FineReader PDF

ABBYY FineReader PDF是一款专业的OCR文字识别和PDF编辑工具&#xff0c;可以帮助用户更好地处理和管理PDF文档。以下是ABBYY FineReader PDF的一些特点&#xff1a; 1. 文字识别精准&#xff1a;ABBYY FineReader PDF具有强大的OCR文字识别功能&#xff0c;可以将PDF中的文字…

C#导出本机Win32native dll

C# 使用 "3f/DllExport" 工具导出C风格的本机函数 [文 / 张赐荣] 首先&#xff0c;让我们来了解一下什么是争渡读屏软件&#xff0c;以及什么是争渡文本预处理API。争渡读屏软件是一款屏幕朗读软件&#xff0c;用于协助视力障碍人士操作电脑。 争渡文本预处理API是一…

java的amazonaws接口出现无法执行http请求:管道中断

java使用amazonaws的接口上传文件到minio出现以下异常&#xff1a; com.amazonaws.SdkClientException: Unable to execute HTTP request: Broken pipe (Write failed) at com.amazonaws.http.AmazonHttpClient R e q u e s t E x e c u t o r . h a n d l e R e t r y a b l e…

【广州华锐互动】灭火器使用VR教学系统应用于高校消防演练有什么好处?

在科技发展的大潮中&#xff0c;虚拟现实&#xff08;VR&#xff09;技术以其独特的沉浸式体验赢得了各个领域的青睐&#xff0c;其中包括教育和培训。在高校消防演练中&#xff0c;VR也成为了一种新的消防教育方式。 由广州华锐互动开发的VR消防演练系统&#xff0c;就包含了校…

神经网络(MLP多层感知器)

分类 神经网络可以分为多种不同的类型&#xff0c;下面列举一些常见的神经网络类型&#xff1a; 前馈神经网络&#xff08;Feedforward Neural Network&#xff09;&#xff1a;前馈神经网络是最基本的神经网络类型&#xff0c;也是深度学习中最常见的神经网络类型。它由若干个…

【工具软件】mediamtx——网页、vue3项目中播放 rtsp 视频流(支持265转码)

声明 本文只做 mediamtx 的使用实操&#xff0c;请务必参考下面的博客,&#xff0c;我也参考下面的大佬博客&#xff0c;感谢唯一602的无私分享&#xff1a; 在web页面中直接播放rtsp视频流&#xff0c;重点推荐&#xff1a;mediamtx&#xff0c;不仅仅是rtsp mediamtx 介绍 …

C++ 与基本数据类型:整型、布尔型与字符型

文章目录 参考描述数据类型基本数据类型与复合数据类型静态数据类型 整形数据类型有符号整型数据类型无符号整型数据类型符号位 最少内存空间概念确定大小sizeof 运算符 进制C 中的不同进制数值表示cout 与进制转化影响范围二进制 后缀字面量整型字面量的默认数据类型主动权整型…

代码随想录算法训练营第六十天 | 单调栈 part 1 | 739. 每日温度、496.下一个更大元素 I

目录 739. 每日温度思路代码 496.下一个更大元素 I思路代码 739. 每日温度 Leetcode 思路 维持一个单调递增的栈&#xff0c;向栈逐一pushtemperatures里的index。 如果当前遍历的元素大于栈顶元素&#xff0c;这意味着 栈顶元素的 右边的最大的元素就是 当前遍历的元素&…

【网络安全】网络安全的最后一道防线——“密码”

网络安全的最后一道防线——“密码” 前言超星学习通泄露1.7亿条信息事件武汉市地震监测中心遭境外网络攻击事件 一、密码起源1、 古代密码2、近代密码3、现代密码4、量子密码 二、商密专栏推荐三、如何利用密码保护账号安全&#xff1f;1、账号安全的三大危险&#xff1f;&…

修炼k8s+flink+hdfs+dlink(四:k8s(一)概念)

一&#xff1a;概念 1. 概述 1.1 kubernetes对象. k8s对象包含俩个嵌套对象字段。 spec&#xff08;规约&#xff09;&#xff1a;期望状态 status&#xff08;状态&#xff09;&#xff1a;当前状态 当创建对象的时候&#xff0c;会按照spec的状态进行创建&#xff0c;如果…

Kotlin的作用域函数 let、also、with、run、apply

作用域函数主要有下面这几种&#xff0c;apply &#xff0c;with 、run 、let 、以及 also 。这些函数非常类似&#xff0c;它们的主要区别&#xff1a; 引⽤上下⽂对象的⽅式 &#xff08;this / it&#xff09;返回值 他们在开发中的使用场景主要有两个&#xff0c;一是非空…

javascript中map和filter的区别与联系

javascript中map和filter的区别与联系如何获取对象数组中某个值 javascript中map和filter的区别与联系 在 JavaScript 中&#xff0c;map 和 filter 是两个常用的数组方法&#xff0c;用于对数组进行转换和过滤操作。它们的区别和联系如下&#xff1a; 功能不同&#xff1a; m…

【C++11算法】is_sorted、is_sorted_until

文章目录 前言一、is_sorted函数1.1 is_sorted是什么1.2 函数原型1.3 示例代码1二、is_sorted_until2.1 is_sorted_until是什么&#xff1f;2.2 函数原型2.3示例代码2 总结 前言 在C11标准中&#xff0c;引入了一系列强大的算法函数&#xff0c;用于处理容器和序列。这些算法函…

将网站域名访问从http升级到https(腾讯云/阿里云)

文章目录 1.前提说明2.服务器安装 docker 与 nginx2.1 安装 docker&#x1f340; 基于 centos 的安装&#x1f340; 基于ubuntu 2.2 配置阿里云国内加速器&#x1f340; 找到相应页面&#x1f340; 创建 docker 目录&#x1f340; 创建 daemon.json 文件&#x1f340; 重新加载…

MATLAB算法实战应用案例精讲-【图像处理】SLAM技术详解(最终篇)

目录 前言 知识储备 点云数据 传感器 3D视觉方案 几个高频面试题目