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

Python Flask 图片上传与下载

Python代码

#encoding:utf-8
#!/usr/bin/env python
from werkzeug.utils import secure_filename
from flask import Flask, render_template, jsonify, request, make_response, send_from_directory, abort
import osapp = Flask(__name__)
UPLOAD_FOLDER = 'upload'
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
basedir = os.path.abspath(os.path.dirname(__file__))
ALLOWED_EXTENSIONS = set(['png', 'jpg', 'JPG', 'PNG', 'gif', 'GIF'])def allowed_file(filename):return '.' in filename and filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS@app.route('/')
def upload_test():ip = request.remote_addrprint(ip)return render_template('up.html')# 上传文件
@app.route('/up_photo', methods=['post'], strict_slashes=False)
def api_upload():ip = request.remote_addrfile_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER'],ip)if not os.path.exists(file_dir):os.makedirs(file_dir)f = request.files['photo']if f and allowed_file(f.filename):fname = secure_filename(f.filename)print (fname,f.filename,file_dir)f.save(os.path.join(file_dir, f.filename))return render_template('up.html',name="已成功上传:"+f.filename)else:return jsonify({"error": 1001, "msg": "file type error"})@app.route('/download/<string:filename>', methods=['GET'])
def download(filename):ip = request.remote_addrfilename = ip + "/" + filenameif request.method == "GET":if os.path.isfile(os.path.join('upload', filename)):return send_from_directory('upload', filename, as_attachment=True)else:return jsonify({"error": 1001, "msg": filename + " not exist!"})# show photo
@app.route('/show/<string:filename>', methods=['GET'])
def show_photo(filename):file_dir = os.path.join(basedir, app.config['UPLOAD_FOLDER'])if request.method == 'GET':if filename is None:passelse:image_data = open(os.path.join(file_dir, '%s' % filename), "rb").read()response = make_response(image_data)response.headers['Content-Type'] = 'image/png'return responseelse:passif __name__ == '__main__':app.run(threaded=True)

网页代码

up.html 注意放到templates目录下,具体代码如下

<!DOCTYPE html>
<html lang="en"><head><meta charset="UTF-8"><title>Title</title>
</head><body><div><form method="post" action="http://localhost:5000/up_photo" enctype="multipart/form-data"><input type="file" size="30" name="photo" id="photo_name" required="required" /><br><br><input type="submit" value="上传处理" class="button-new" style="margin-top:15px;" /></form><label id="return_photo_name">{{ name }}</label><br><input type="submit" value="下载AI放大图片" onclick="down_img()" style="margin-top:15px;" /></div>
</body>
<script>function down_img() {// var file_name = document.getElementById('photo_name').files[0].name;var return_file_name = document.getElementById('return_photo_name').innerText.trim();return_file_name = return_file_name.replace("已成功上传:", "");// alert("return_file_name is : " + return_file_name);if (return_file_name == "") {alert("请先上传图片");return;}else {window.location.href = "http://localhost:5000/download/" + return_file_name;}// alert("Hello, World!" + file_name);}
</script></html>

相关文章:

  • 基于yolov5和desnet的猫咪识别模型
  • 深度学习中的优化算法二(Pytorch 19)
  • Spring ----> IOC
  • 探索集合python(Set)的神秘面纱:它与字典有何不同?
  • 【建议收藏】30个较难Python脚本,纯干货分享
  • jenkins升级,涉及ssh remote执行出现Algorithm negotiation fail
  • C++系列-static成员
  • Spring Boot 项目统一异常处理
  • netplan
  • Visual Studio 的调试(一)
  • 42-4 应急响应之文件痕迹排查
  • Rust面试宝典第14题:旋转数组
  • Redis教程(十三):Redis的主从复制模式搭建
  • 【论文阅读】Prompt Fuzzing for Fuzz Driver Generation
  • 设计模式-中介者模式
  • Android 控件背景颜色处理
  • log4j2输出到kafka
  • php的插入排序,通过双层for循环
  • vue-loader 源码解析系列之 selector
  • 工作手记之html2canvas使用概述
  • 关于springcloud Gateway中的限流
  • 基于axios的vue插件,让http请求更简单
  • 解决jsp引用其他项目时出现的 cannot be resolved to a type错误
  • 聊聊hikari连接池的leakDetectionThreshold
  • 前端
  • 前端技术周刊 2019-01-14:客户端存储
  • 入职第二天:使用koa搭建node server是种怎样的体验
  • 三分钟教你同步 Visual Studio Code 设置
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 通过来模仿稀土掘金个人页面的布局来学习使用CoordinatorLayout
  • 小李飞刀:SQL题目刷起来!
  • SAP CRM里Lead通过工作流自动创建Opportunity的原理讲解 ...
  • # 深度解析 Socket 与 WebSocket:原理、区别与应用
  • #Linux杂记--将Python3的源码编译为.so文件方法与Linux环境下的交叉编译方法
  • #QT(智能家居界面-界面切换)
  • (07)Hive——窗口函数详解
  • (1)Nginx简介和安装教程
  • (4) PIVOT 和 UPIVOT 的使用
  • (C++)八皇后问题
  • (LeetCode) T14. Longest Common Prefix
  • (纯JS)图片裁剪
  • (附源码)ssm高校社团管理系统 毕业设计 234162
  • (论文阅读23/100)Hierarchical Convolutional Features for Visual Tracking
  • (欧拉)openEuler系统添加网卡文件配置流程、(欧拉)openEuler系统手动配置ipv6地址流程、(欧拉)openEuler系统网络管理说明
  • (亲测有效)解决windows11无法使用1500000波特率的问题
  • (十八)三元表达式和列表解析
  • (十七)Flink 容错机制
  • (已更新)关于Visual Studio 2019安装时VS installer无法下载文件,进度条为0,显示网络有问题的解决办法
  • (转)chrome浏览器收藏夹(书签)的导出与导入
  • .Net Core中的内存缓存实现——Redis及MemoryCache(2个可选)方案的实现
  • .NET/C# 异常处理:写一个空的 try 块代码,而把重要代码写到 finally 中(Constrained Execution Regions)
  • .NET+WPF 桌面快速启动工具 GeekDesk
  • .Net的C#语言取月份数值对应的MonthName值
  • .NET业务框架的构建
  • @Autowired 与@Resource的区别