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)

四、写在最后

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

相关推荐
jbtianci2 小时前
Spring Boot管理用户数据
java·spring boot·后端
程序员ken2 小时前
深入理解大语言模型(8) 使用 LangChain 开发应用程序之上下文记忆
人工智能·python·语言模型·langchain
那我掉的头发算什么2 小时前
【Mybatis】Mybatis-plus使用介绍
服务器·数据库·后端·spring·mybatis
wazmlp0018873692 小时前
第五次python作业
服务器·开发语言·python
尘缘浮梦2 小时前
websockets简单例子1
开发语言·python
不懒不懒2 小时前
【从零开始:PyTorch实现MNIST手写数字识别全流程解析】
人工智能·pytorch·python
helloworld也报错?2 小时前
基于CrewAI创建一个简单的智能体
人工智能·python·vllm
会算数的⑨2 小时前
Kafka知识点问题驱动式的回顾与复习——(一)
分布式·后端·中间件·kafka
Hx_Ma162 小时前
SSM搭建(三)Spring整合SpringMVC框架
java·后端·spring