Flask secure_filename 上传文件

本文介绍了一个使用Flask框架实现的文件上传项目,包括代码结构、上传功能的实现细节及解决中文文件名的问题。项目通过定义允许的文件类型,设置上传路径,并利用Werkzeug的secure_filename确保文件名的安全。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

项目结构

在这里插入图片描述

app.py:

import os
from flask import Flask, request, jsonify, render_template, url_for, flash, redirect
from werkzeug.utils import secure_filename

ALLOWED_EXTENSIONS = {'txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif'}
UPLOAD_FOLDER = os.path.dirname(__file__)

app = Flask(__name__)
app.secret_key = '666'
app.config['MAX_CONTENT_LENGTH'] = 16 * 1024 * 1024

def allowed_file(filename):
    return '.' in filename and filename.rsplit('.',1)[-1].lower() in ALLOWED_EXTENSIONS

# 上传文件
@app.route('/upload',methods=['GET','POST'])
def upload():
    if request.method == 'GET':
        return render_template('upload.html')
    if request.method == 'POST':
        # 检查是否有文件部分
        if 'file' not in request.files:
            flash('No file part')
            return redirect(request.url)

        file = request.files['file']
        folder = request.form.get('folder')

        # 判断是否存在文件
        if file.filename == '':
            flash('No selected file')
            return redirect(request.url)

        # 判断文件名是否允许
        if file and allowed_file(file.filename):

            # 文件存放路径是否存在,不存在就创建
            path = '/static/' + folder + '/'                        # 相对路径
            end_path =  UPLOAD_FOLDER + '/static/' + folder + '/'   # 最终路径
            if not os.path.exists(end_path):
                os.makedirs(end_path)

            # 安全的去文件名,但是不识别中文,后续解决
            filename = secure_filename(file.filename)

            # 保存文件 http://127.0.0.1:1000/static/img/1.jpg
            file.save(end_path + filename)

            flash(f'Upload Success! 文件路径:{path+filename}')
            return render_template('upload.html',url=path+filename)
        else:
            flash('Not file or Not allowed')
            return redirect(request.url)



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

templates:

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <title>上传文件</title>
</head>
<body>

<form method="post" enctype="multipart/form-data">
    <a>文件:</a><input type="file" name="file" placeholder="请上传文件"> <br>
    <a>文件夹:</a><input type="text" name="folder" placeholder="文件夹"> <br>
    <input type="submit" value="提交">

    {# 使用遍历获取闪现的消息 #}
    {% for message in get_flashed_messages() %}
        {{ message }}
    {% endfor %}

</form>
<br>
{# 展示图片 #}
<img src="{{ url }}" alt="">

</body>
</html>

解决 secure_filename:

1、Ctrl + 鼠标左键,跳转

在这里插入图片描述
2、在 utils.py 文件中,修改:

  • 37行:filename_ascii_strip_re = re.compile(r’[^A-Za-z0-9.-]’)
  • 后面加上:filename_gbk_strip_re = re.compile(u"[^\u4e00-\u9fa5A-Za-z0-9.-]")

在这里插入图片描述

3、在 415 行,改 acsii 为 utf-8

在这里插入图片描述
4、在 424 行,_filename_ascii_strip_re 改成 _filename_gbk_strip_re

在这里插入图片描述

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值