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,然后在列中增加文件上传按钮,如下所示:

html 复制代码
<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,加上点击操作:

javascript 复制代码
$("#submitButton").click(function () {
	// 构造数据
	var formData = new FormData();
	var attachList = document.getElementsByName("rowIdx");
    for (var x=0; x<attachList.length; x++) {
    	// 接收前面input的细节,略
		// 拼接一下文件的id
		var 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的id
	formData.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) {
			// 做一些处理
		}
    });
});

在后台这样写:

python 复制代码
@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.

相关推荐
惊讶的猫5 分钟前
langchain-agent的基础使用
python·langchian
把我格子衫拿来1 小时前
VTK 体绘制入门到排错:传递函数、采样距离与透明度的关系
python·vtk·可视化·医学影像·体绘制
张张123y7 小时前
后端第一课:输入 URL 后发生了什么?我用手写 Socket 把全链路跑通了
python·websocket·ai·socket·url·后端开发
白帽攻防录8 小时前
SRC 挖洞:PostScript 打印机驱动双 RCE,打印服务器怎么变成内网跳板
开发语言·网络安全·php·内网安全
十年Java程序媛8 小时前
Java枚举Enum完整教程|替代静态常量,开发与面试要点
java·开发语言·spring boot·后端·面试
全栈弄潮儿9 小时前
Python实战第7期:字典与集合
后端·python·编程语言
2603_965148119 小时前
电商选品调研:通过关键词搜索API获取市场热销商品,结合商品详情API分析竞品卖点与定价
开发语言·数据库·人工智能·python·信息可视化
xixiaoyunya10 小时前
Python 异步编程入门:用 asyncio 轻松实现并发任务
开发语言·python·php
把我格子衫拿来10 小时前
Dice 很高就够了吗?分割评价中的 IoU、表面距离与 HD95
python·图像分割·模型评估·医学影像·dice
学逆向的10 小时前
C 循环结构的执行效率分析
c语言·开发语言·数据结构·网络安全