Flask python 开发篇:上传文件(在指定目录下创建文件夹)

flask上传文件以及常见问题

一、flask文档上传文件的介绍

Flask上传文件的文档介绍,文件上传的基本思想实际上非常简单。它基本上是这样工作的:

  • 1、一个<form>标签用enctype = multipart / form-data标记,<input type = file>放在那个表格中。

  • 2、应用程序从请求对象上的:attr:~flask.request.files字典访问该文件。

  • 3、使用 save() 方法将文件永久保存在文件系统的某个位置。

切记1:在将文件直接存储到文件系统之前,一定要使用secure_filename()函数来保护文件名。
切记2:一定要限制上传文件的扩展

二、上传文件的实现

2.1、生成一个from表单,用来提交图片

在同级别下的templates目录下,新建一个upload.html文件,代码如下:

c 复制代码
<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>
   <form action="" method="post" enctype="multipart/form-data">
    <table>
            <tr>
                <td>头像:</td>
                <td><input type="file" name="file"></td>
            </tr>
           
            <tr>
                <td></td>
                <td><input type="submit" value="提交"></td>
            </tr>
    </table>
  </form>
 </body>
</html>
2.2、编写上传的逻辑

在upload.py文件中,编写上传的逻辑,代码如下:

复制代码
from flask import Flask, render_template, request, send_from_directory
from werkzeug.utils import secure_filename
import os
import uuid

app = Flask(__name__)

# 设置文件上传保存路径
app.config['UPLOAD_FOLDER'] = 'static/uploads/'
# MAX_CONTENT_LENGTH设置上传文件的大小,单位字节
app.config['MAX_CONTENT_LENGTH'] = 1 * 1024 * 1024

@app.route('/', methods = ['GET'])
def hell():
    return  '翻倍阿'

@app.route('/upload', methods=['GET', 'POST'])
def upload():
    # 如果是get请求响应上传视图,post请求响应上传文件
    if(request.method == 'GET'):
        return render_template('upload.html')
    else:

        if 'file' not in request.files:
            return 'No file part'

        file = request.files['file']

        if file.filename == '':
            return 'No selected file'

        fname = secure_filename(file.filename)
        ext = fname.rsplit('.')[-1]

        # # 生成一个uuid作为文件名
        fileName = str(uuid.uuid4()) + "." + ext
        # return fileName

        # # os.path.join拼接地址,上传地址,f.filename获取文件名
        static_upload_path = app.config['UPLOAD_FOLDER']

        if not os.path.exists(static_upload_path):
                os.makedirs(static_upload_path)

        file.save(os.path.join(app.config['UPLOAD_FOLDER'], fileName))
        return 'ok'

# 图片下载
@app.route('/download/<filename>', methods=['GET'])
def download(filename):
    if request.method == "GET":
        #通过文件名下载文件
        # return os.path.join(app.config['UPLOAD_FOLDER'], filename)
        path = os.path.isfile(os.path.join(app.config['UPLOAD_FOLDER'], filename))
        # return {
        #     'is_file' :path
        # }
        if path:
            return send_from_directory(app.config['UPLOAD_FOLDER'], filename, as_attachment=True)

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

要是想限制上传文件的类型,可以参考文档上的:

三、运行代码、以及常见异常

运行以后,是这样的:

若是选中文件提交以后,出现异常

这里需要确保保存文件的目录真实存在,且有权限,所以为了避免该问题,最好在代码中判断一下目录是否存在

复制代码
        if not os.path.exists(static_upload_path):
                os.makedirs(static_upload_path)

四、写在最后

宣传一波:大家若是有人想北京租房可以联系我,主要是物资学院、通州北关、北苑、草房的房子。(注:我不是中介哟,我也不打算转行做中介,是我靠谱的朋友在做)

相关推荐
晓风残月淡2 小时前
JVM字节码与类的加载(二):类加载器
jvm·python·php
摇滚侠3 小时前
Spring Boot 3零基础教程,IOC容器中组件的注册,笔记08
spring boot·笔记·后端
西柚小萌新4 小时前
【深入浅出PyTorch】--上采样+下采样
人工智能·pytorch·python
程序员小凯5 小时前
Spring Boot测试框架详解
java·spring boot·后端
你的人类朋友6 小时前
什么是断言?
前端·后端·安全
shut up6 小时前
LangChain - 如何使用阿里云百炼平台的Qwen-plus模型构建一个桌面文件查询AI助手 - 超详细
人工智能·python·langchain·智能体
宝贝儿好7 小时前
【python】第五章:python-GUI编程
python·pyqt
程序员小凯7 小时前
Spring Boot缓存机制详解
spring boot·后端·缓存
闲人编程7 小时前
从多个数据源(CSV, Excel, SQL)自动整合数据
python·mysql·数据分析·csv·存储·数据源·codecapsule
i学长的猫7 小时前
Ruby on Rails 从0 开始入门到进阶到高级 - 10分钟速通版
后端·ruby on rails·ruby