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)

四、写在最后

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

相关推荐
Jonathan Star1 分钟前
MediaPipe 在Python中实现人体运动识别,最常用且高效的方案是结合**姿态估计**(提取人体关键点)和**动作分类**(识别具体运动)
开发语言·python·分类
山顶听风24 分钟前
分页条初始化
python
我是天龙_绍1 小时前
java 比对两对象大小 重写 comparator
后端
NewsMash1 小时前
PyTorch之父发离职长文,告别Meta
人工智能·pytorch·python
IT_陈寒1 小时前
Python 3.12新特性实测:10个让你的代码提速30%的隐藏技巧 🚀
前端·人工智能·后端
BingoGo1 小时前
从零开始打造 Laravel 扩展包:开发、测试到发布完整指南
后端·php
9号达人1 小时前
普通公司对账系统的现实困境与解决方案
java·后端·面试
硅农深芯1 小时前
如何使用ptqt5实现进度条的动态显示
开发语言·python·qt
golang学习记1 小时前
Go 1.26 新特性:netip.Prefix.Compare —— 标准化 IP 子网排序能力
后端