【Python】Web学习笔记_flask(3)——上传文件

用GET、POST请求上传图片并呈现出来

首先还是创建文件上传的模板

html 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传图片</title>
</head>
<body>
<form action="" method="post" enctype="multipart/form-data">
    <div>
        <label for="avatar">上传图片</label>
        <input type="file" id="avatar" name="avatar" value="">
    </div>
    <button type="submit">提交</button>
</form>

</body>
</html>

然后需要定义几个函数:

upload():路由函数,接收GET请求时,显示模板文件内容,接收post请求时,上传图片

allowed_file():检测上传的文件是否满足设置的类型

random_file():为上传的文件重新创建随机的不重复文件名

uploaded_file():显示图片内容

python 复制代码
import os.path
import uuid
import config

from flask import Flask,url_for,redirect,request,render_template,send_from_directory

ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif','PNG', 'JPG', 'JPEG', 'GIF',}

app=Flask(__name__)
UPLOAD_FOLDER = os.path.join(app.root_path,'uploads')
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER
@app.route('/upload',methods=['GET','POST'])
#创建路由函数,接收GET请求时,显示模板文件内容,接收post请求时,上传图片
def upload():
    """
    #头像上传表单页面
    :return:
    """
    if request.method=='POST':
        #接受头像字段
        avatar=request.files['avatar']
        #判断头像是否上传
        if avatar and allowed_file(avatar.filename):
            filename=random_file(avatar.filename)
            avatar.save(os.path.join(app.config['UPLOAD_FOLDER'],filename))
            return redirect(url_for('uploaded_file',filename=filename))
    return render_template('upload.html')

def allowed_file(filename):
    """
    #判断上传文件类型是否允许
    :param filename 文件名
    :return: 布尔值 TRUE or False
    """
    print(filename)
    return '.' in filename and filename.rsplit('.',1)[1] in ALLOWED_EXTENSIONS

def random_file(filename):
    """
    生成随机文件名
    :param filename: 文件名
    :return:随机文件名
    """
    ext=os.path.splitext(filename)[1]
    #使用uuid生成随机字符
    new_filename=uuid.uuid4().hex+ext
    return new_filename

@app.route('/uploads/<filename>')
def uploaded_file(filename):
    """
    显示上传头像
    :param filename:文件名
    :return: 真实文件路径
    """
    return send_from_directory(app.config['UPLOAD_FOLDER'],filename)


if __name__=='__main__':
    app.run(
        debug=True
    )

需要单独设置的内容:

ALLOWED_EXTENSIONS:文件后缀类型

UPLOAD_FOLDER:上传文件的路径,如果不设置,会报错:

KeyError: 'UPLOAD_FOLDER'

python 复制代码
ALLOWED_EXTENSIONS = {'png', 'jpg', 'jpeg', 'gif','PNG', 'JPG', 'JPEG', 'GIF',}

UPLOAD_FOLDER = os.path.join(app.root_path,'uploads')
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER

相关推荐
喵手几秒前
Python爬虫零基础入门【第二章:网页基础·第2节】你要抓的到底是什么:HTML、CSS 选择器、XPath 入门?
爬虫·python·python爬虫实战·python爬虫工程化实战·python爬虫零基础入门·网页基础·网页结构解析
web小白成长日记2 分钟前
Vue3中如何优雅实现支持多绑定变量和修饰符的双向绑定组件?姜姜好
前端·javascript·vue.js
飞天小蜈蚣2 分钟前
python-django_ORM的十三个查询API接口
开发语言·python·django
煎蛋学姐3 分钟前
SSM学习互助平台网站8f554(程序+源码+数据库+调试部署+开发环境)带论文文档1万字以上,文末可获取,系统界面在最后面
学习·ssm 框架·javaweb 开发·书籍分类
AI_零食5 分钟前
鸿蒙跨端框架 Flutter 学习 Day 4:异步编程基础——Future 与非阻塞执行的物理真相
学习·flutter·harmonyos
晴天飛 雪7 分钟前
Spring Boot 接口耗时统计
前端·windows·spring boot
人工智能AI技术9 分钟前
【Agent从入门到实践】18 脚本化编程:批量执行、自动化逻辑
人工智能·python
摘星编程11 分钟前
React Native + OpenHarmony:MapView自定义标注样式
python
向量引擎15 分钟前
[硬核架构] 2026 企业级 AI 网关落地指南:从“连接超时”到“秒级响应”的架构演进(附 Python/Java 源码)
人工智能·python·gpt·ai作画·架构·aigc·api调用
0思必得016 分钟前
[Web自动化] Selenium模拟用户的常见操作
前端·python·selenium·自动化