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

Flask+HTML+Jquery 文件上传下载

HTML 代码:

<div id="loadingIndicator" style="display:none;"><div class="spinner"></div>
</div>  <!-- 请求过程中转圈圈 -->
<form action="" method="post" enctype="multipart/form-data"><center><div id="main"><div id="un" ><input class="inp" type="text" placeholder="请输入手机型号" name="camera_type" id="phone_type"></div><div id="pd"><input  class="inp" type="text" placeholder="请输入版本号" name="version_num" id="version_num"></div><div id="vn"><input  class="inp" type="file" placeholder="请选择版本文件" name="versionFile" id="versionFile"></div><div class="bt"><input class="btns" type="button" value="上&nbsp;&nbsp;&nbsp;传&nbsp;&nbsp;&nbsp;文&nbsp;&nbsp;&nbsp;件" id="btn"></div></div></center>
</form>

CSS 代码:

.inp{background-color: #F0F8FF;width:30%;height:30px;line-height:30px;margin-top: 10px;}.btns{background-color: lightblue;width:30%;height:30px;line-height:30px;margin-top: 10px;}#inputs{width:100%;<!--background-color:green;-->}#loadingIndicator {display: none;position: fixed;top: 50%;left: 50%;transform: translate(-50%, -50%);}.spinner {width: 40px;height: 40px;margin: 0 auto;border-radius: 50%;border: 4px solid #f3f3f3;border-top: 4px solid #3498db;animation: spin 2s linear infinite;}@keyframes spin {0% { transform: rotate(0deg); }100% { transform: rotate(360deg); }}

Jquery代码:

$(document).ready(function(){console.log("aaa");$("#btn").click(function(){$('#loadingIndicator').show();console.log("click...")var formdata= new FormData()formdata.append("phone_type",$("#phone_type").val())formdata.append("version_num",$("#version_num").val())formdata.append("file",$("#versionFile")[0].files[0])console.log(formdata)$.ajax({url:"/uploadfile",type:"POST",data:formdata,processData: false,  // 必须设置为 false 以防止 jQuery 解析 FormData 对象contentType: false,  // 必须设置为 false 以允许 FormData 发送原始数据success:function (data) {console.log(data)if (data.msg) {alert(data.msg);}},error: function(xhr, status, error) {alert("上传失败,请重试!, 错误信息:" + error);},complete: function() {// 隐藏转圈动画$('#loadingIndicator').hide();}})})})

Flask部分代码:

@app.route("/uploadfile",methods=["POST"])
def uploadfile():if request.method=="POST":login_user=get_loginname()if login_user=="guest":return jsonify(msg="请登录!",user=login_user)file = request.files.get("file")print(file)if not file:return jsonify(msg="请选择文件!",user=login_user)camera_type=request.form.get("camera_type")if not camera_type:return jsonify(msg="请输入相机型号!",user=login_user)version_num=request.form.get("version_num")if not version_num:return jsonify(msg="请输入版本号!",user=login_user)print(len(file.read()))if len(file.read()) > 1024*1024*256:return jsonify(msg=f"文件过大!(camera_type:{camera_type},version:{version_num})",user=login_user)file.seek(0)try:filename = "nvp_fw.bin"filepath = os.path.join(uploadrootdir,  camera_type)versionfile=os.path.join(filepath, version_num)if not os.path.exists(filepath):os.makedirs(filepath,mode=777)else:shutil.rmtree(filepath)os.makedirs(filepath,mode=777)filefullpath = os.path.join(filepath, filename)file.save(filefullpath)with open(versionfile, 'w') as f:passreturn jsonify(msg=f"upload success!(camera_type:{camera_type},version:{version_num})",user=login_user)except Exception as e:print(e)return jsonify(msg=f"upload failed!(camera_type:{camera_type},version:{version_num}) (e)",user=login_user)return jsonify(msg="upload failed! only support post method")@app.route("/download/<SNtype>/<file_name>",methods=["GET"])
def download(SNtype,file_name):#根据SNType确定文件所在具体位置,刚开始用的是send_from_directory 一直报404,改用send_fileprint("download:",SNtype,file_name)rootdir=os.path.join(uploadrootdir,SNtype)print(SNtype,file_name)print("rootdir:",rootdir)filepath=os.path.join(rootdir,file_name)if not os.path.exists(filepath):return Response("file not exists!")return send_file(path_or_file=filepath,as_attachment=True)

开发调试过程中,前端老是报错:SyntaxError: Failed to execute 'querySelectorAll' on 'Element': '*,:x' is not a valid selector 等,无奈直接删除min.js中相应部分代码

相关文章:

  • DeepSeek 赋能汽车全生态:从产品到服务的智能化跃迁
  • supabase 怎么新建项目?
  • Oracle 在线日志文件和控制文件损坏处理思路
  • FedTracker:为联邦学习模型提供所有权验证和可追溯性
  • 黑马k8s(五)
  • javax.servlet.Filter 介绍-笔记
  • 邀请函|PostgreSQL培训认证报名正式开启
  • FFmpeg 与 C++ 构建音视频处理全链路实战(三)—— FFmpeg 内存模型
  • 什么情况会导致JVM退出?
  • 游戏引擎学习第275天:将旋转和剪切传递给渲染器
  • 基于TouchSocket实现WebSocket自定义OpCode扩展协议
  • 【Folium】使用离线地图
  • 百度导航广告“焊死”东鹏特饮:商业底线失守,用户安全成隐忧
  • 【NLP 72、Prompt、Agent、MCP、function calling】
  • R²AIN SUITE:AI+文档切片,重塑知识管理新标杆
  • 《驱动开发硬核特训 · 专题篇》:深入理解 I2C 子系统
  • Spring Boot 的自动配置为 Spring MVC 做了哪些事情?
  • 竞业禁止协议中AI技能限制的深度剖析
  • Java jar包程序 启动停止脚本 shell bash
  • STM32 __main汇编分析
  • 金正恩观摩朝鲜人民军各兵种战术综合训练
  • 美凯龙:董事兼总经理车建兴被立案调查并留置
  • 习近平举行仪式欢迎巴西总统卢拉访华
  • 马上评丨岂能为流量拿自己的生命开玩笑
  • 真人秀《幸存者》百万美元奖金,25年间“缩水”近一半
  • 郑州通报涉“健康证”办理有关问题查处进展情况