【问题标题】:How can I change a file change name as it is uploaded with Flask?如何更改使用 Flask 上传的文件更改名称?
【发布时间】:2020-06-01 20:17:37
【问题描述】:

我正在尝试为我的团队创建一个网络应用程序,我们希望它能够获取用户上传的照片并在上传时重命名它们。现在,我的机器上有一个文件所在的目录。我的应用需要 3 个输入:姓名、电子邮件和要上传的文件。用户单击“上传”按钮后,我希望文件作为他们输入的电子邮件地址显示在我的目录中。例如:

Name: trent
Email: trent@trent.com
File: photo_of_trent.jpg

我希望上传的文件在我的目录中显示为 trent@trent.com.jpg。

我的 Python/Flask 代码如下:

import os
from flask import Flask, render_template
from flask_uploads import UploadSet, configure_uploads, IMAGES, patch_request_class
from flask_wtf import FlaskForm
from flask_wtf.file import FileField, FileRequired, FileAllowed
from wtforms import StringField
from wtforms import SubmitField
from wtforms.validators import DataRequired, Email

basedir = os.path.abspath(os.path.dirname(__file__))

app = Flask(__name__)
app.config['SECRET_KEY'] = 'I have a dream'
app.config['UPLOADED_PHOTOS_DEST'] = os.path.join(basedir, 'uploads') # you'll need to create a folder named uploads

photos = UploadSet('photos', IMAGES)
configure_uploads(app, photos)
patch_request_class(app)  # set maximum file size, default is 16MB


class UploadForm(FlaskForm):
    name = StringField('Name', [DataRequired()])
    email = StringField('Email', [Email(message='Not a valid email address.'), DataRequired()])
    photo = FileField(validators=[FileAllowed(photos, 'Image only!'), FileRequired('File was empty!')])
    submit = SubmitField('Upload')


@app.route('/', methods=['GET', 'POST'])
def upload_file():
    form = UploadForm()
    if form.validate_on_submit():
        filename = photos.save(form.photo.data)
        file_url = photos.url(filename)
    else:
        file_url = None
    return render_template('index.html', form=form, file_url=file_url)


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

我的html如下:

{% extends 'layout.html' %}

{% block styles %}
    <link rel="stylesheet" href="{{ url_for('static', filename='css/forms.css') }}" rel="stylesheet" type="text/css">
{% endblock %}


{% block content %}
<div class="formwrapper">
  <h2 class="title">Contact</h2>
  <form method="POST" action="/" enctype="multipart/form-data">
      <div class="form-field">{{ form.name.label }} {{ form.name(size=20) }}
      {% if form.name.errors %}
        <ul class="errors">
          {% for error in form.name.errors %}
            <li>{{ error }}</li>
          {% endfor %}
        </ul>
      {% endif %}
      </div>
      <div class="form-field">{{ form.email.label }} {{ form.email }}
      {% if form.email.errors %}
        <ul class="errors">
            {% for error in form.email.errors %}
                <li>{{ error }}</li>
            {% endfor %}
        </ul>
    {% endif %}
      </div>
       {{ form.hidden_tag() }}
     {{ form.photo }}
      {{ form.submit }}

  </form>
</div>
{% endblock %}

这不是超级复杂,我将这段代码拼凑在一起,因为这是我对 Flask 的第一次实质性体验。就 html 而言,那里散布着一点 jinja。到目前为止,程序只上传带有文件名的文件。任何帮助表示赞赏。谢谢你。

【问题讨论】:

    标签: python html flask file-upload jinja2


    【解决方案1】:

    UploadSet.save() 函数接受一个参数name,它应该会给你你想要的。

    例如

    photos.save(form.photo.data, name=f"{form.email.data}.jpg") 
    

    注意:我不确定在这种情况下将如何处理文件扩展名,因此您可能需要对此进行测试/调整。

    【讨论】:

    • 谢谢,我试试看。
    • 完美运行。你是最棒的。
    猜你喜欢
    • 1970-01-01
    • 2018-02-14
    • 1970-01-01
    • 2011-09-18
    • 2014-11-26
    • 2012-05-13
    • 2013-02-14
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多