当前位置: 首页 > news >正文

python-flask-上传多个文件并存储

本地环境:win10 / centos6 , python3


flask入门看这里:

python-flask结合bootstrap实现网页小工具实例-半小时速通版_bootstrap flask-CSDN博客
https://blog.csdn.net/pxy7896/article/details/137854455

动态添加和删除表格中的行,看这里:

javascript-动态增加和删除表格的行-CSDN博客
https://blog.csdn.net/pxy7896/article/details/141030235


问题描述

在前台上传1~N个文件,后台接收并存储。

实现效果

点击“添加峰图”按钮,可以不断加行:
在这里插入图片描述
实际的html内容类似:
在这里插入图片描述
后台则需要接收这些附件(前一个input也要)。

解决方案

在前台构建一个form,在里面放一个table,然后在列中增加文件上传按钮,如下所示:

<form action="run_command_ab1" id="main_form" ><div id="suborderlist" class="row col-md-12"><table><!-- 略去一些内容 --><!-- 这是编号 --><td name="rowIdx" style="width:10%;"></td><td style="width:40%;"><input name="attach" type="file" id="customFile"></td></table>
</form>

提交按钮的id是submitButton,加上点击操作:

$("#submitButton").click(function () {// 构造数据var formData = new FormData();var attachList = document.getElementsByName("rowIdx");for (var x=0; x<attachList.length; x++) {// 接收前面input的细节,略// 拼接一下文件的idvar idx = "attach." + attachList[x].innerText.toString();var attachFile = document.getElementById(idx).files[0];if (attachFile == null) {// 处理空文件var blob = new Blob([], {type: "text/plain;charset=utf-8"});formData.append("subAttach", blob);} else {formData.append("subAttach", attachFile);}}// 剩余数据// 这里main_form是当前整个form的idformData.append("ab1Order", $("#main_form").serialize());$.ajax({type: 'POST',url: "/run_command_ab1",data: formData,processData: false, // jQuery不要处理发送的数据contentType: false, // jQuery不要设置Content-Type请求头success: function (resp) {// 做一些处理}});
});

在后台这样写:

@app.route('/run_command_ab1', methods=['POST'])
def run_command_ab1():if request.method == 'POST':#print(request.form) # ImmutableMultiDict([('ab1Order', 'sampleId=test&target=313&target=21&target=')])# 所以这样提取信息info = request.form['ab1Order']#print(request.files)# ImmutableMultiDict([('subAttach', <FileStorage: 'xxx.ab1' ('application/octet-stream')>)])# 这样获取文件列表files = request.files.getlist('subAttach')# 遍历for f in files:f.save("/this/is/the/path/" + f.filename)return '文件已上传成功!'

END.

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 有效的字母异位词 | LeetCode-242 | 哈希集合 | 哈希数组
  • LNMP环境搭建论坛
  • 【论文解读】Performance comparison among popular implementations of H.264 encoders
  • 【Bug分析】Keil报错:error: #18:expected a “)“问题解决
  • OpenGL入门一:基础知识及概念
  • [C++] 深入理解面向对象编程特性 : 继承
  • 大数据-72 Kafka 高级特性 稳定性-事务 (概念多枯燥) 定义、概览、组、协调器、流程、中止、失败
  • Network Address Translation,网络地址转换技术
  • 探索HTML5新特性:创建一个多媒体网页
  • Spring Boot 整合 SA-Token 使用详解
  • C++中`vector和tuple`的联合使用和访问方法
  • 一文读懂什么是Go语言goroutine
  • 网络编程先验知识2
  • 全球化系统设计:多时区处理
  • 代理ip池的ip是重复利用的吗?
  • 自己简单写的 事件订阅机制
  • git 常用命令
  • Java到底能干嘛?
  • NSTimer学习笔记
  • redis学习笔记(三):列表、集合、有序集合
  • Transformer-XL: Unleashing the Potential of Attention Models
  • 构建二叉树进行数值数组的去重及优化
  • 离散点最小(凸)包围边界查找
  • 为视图添加丝滑的水波纹
  • 小程序上传图片到七牛云(支持多张上传,预览,删除)
  • 移动端唤起键盘时取消position:fixed定位
  • 再次简单明了总结flex布局,一看就懂...
  • 曾刷新两项世界纪录,腾讯优图人脸检测算法 DSFD 正式开源 ...
  • ​ 全球云科技基础设施:亚马逊云科技的海外服务器网络如何演进
  • ​二进制运算符:(与运算)、|(或运算)、~(取反运算)、^(异或运算)、位移运算符​
  • ​无人机石油管道巡检方案新亮点:灵活准确又高效
  • # 数仓建模:如何构建主题宽表模型?
  • #if #elif #endif
  • #includecmath
  • (1)常见O(n^2)排序算法解析
  • (55)MOS管专题--->(10)MOS管的封装
  • (CPU/GPU)粒子继承贴图颜色发射
  • (delphi11最新学习资料) Object Pascal 学习笔记---第7章第3节(封装和窗体)
  • (MonoGame从入门到放弃-1) MonoGame环境搭建
  • (个人笔记质量不佳)SQL 左连接、右连接、内连接的区别
  • (利用IDEA+Maven)定制属于自己的jar包
  • (四)React组件、useState、组件样式
  • (学习日记)2024.04.04:UCOSIII第三十二节:计数信号量实验
  • (中等) HDU 4370 0 or 1,建模+Dijkstra。
  • (转)Linux整合apache和tomcat构建Web服务器
  • (转)大型网站架构演变和知识体系
  • (轉貼) 寄發紅帖基本原則(教育部禮儀司頒布) (雜項)
  • ./和../以及/和~之间的区别
  • .net core 6 集成和使用 mongodb
  • .NET Core Web APi类库如何内嵌运行?
  • .net web项目 调用webService
  • .net 无限分类
  • .net 写了一个支持重试、熔断和超时策略的 HttpClient 实例池
  • .NET上SQLite的连接
  • /var/log/cvslog 太大