【问题标题】:Flask FileStorage save empty fileFlask FileStorage 保存空文件
【发布时间】:2019-01-02 21:38:54
【问题描述】:

我正在使用 Flask、WTForms 和 Flask-WTF 来保存文件,但文件始终存储为空文件。它没有显示任何错误。

表格:

from flask_wtf import FlaskForm
from flask_wtf.file import FileField
from wtforms import StringField, SubmitField

class UserForm(FlaskForm):
    username = StringField('u', validators=[InputRequired()])
    email = StringField('e', validators=[InputRequired()])
    password = StringField('c', validators=[InputRequired()])
    signature = FileField('s')
    save = SubmitField('a')

Flask 路线/功能:

@bp.route('/manage/user', methods=['GET', 'POST'])
@login_required
def manage_user():
    form = UserForm()
    action = 'create'

    try:        
        if form.validate_on_submit():
            if form.save.data:
                print('request.method', request.method)
                print('request.args', request.args)
                print('request.form', request.form)
                print('request.files', request.files)
                # archivo = request.files['signature']
                # archivo = request.files.items()[0]
                archivo = form.signature.data
                print(type(archivo))
                if archivo:
                    image_data = archivo.read()
                    basedir = os.path.abspath(os.path.dirname(__file__))
                    filename = secure_filename(form.username.data+'.png')
                    full_dir = os.path.join(basedir, '..\\static\\img', filename)
                    print(sys.getsizeof(archivo))
                    archivo.save(full_dir) 
                return redirect(url_for('main.manage'))
    except Exception as e:
        print(e)

    return render_template('manage_user.html', title=('Admon'), form=form, action=action)

HTML

<form action="" method="POST" role="form" class="form-horizontal" enctype="multipart/form-data">
    {{ form.csrf_token() }}
    <div class="form-group">
        <label class="control-label col-sm-3">Firma</label>
        <div class="col-sm-6">
            {% if action=='create' %}
            <!-- Other fields -->
            {{ form.signature(placeholder="Firma", type="file", class="form-control", accept="image/*", required="True") }}
            <img id="firmaimg" src="{{ url_for('static', filename='img/firma130x50_dummy.png') }}" alt="Firma" />
            {{ form.save(class="btn btn-success btn-md") }}
            {% endif %}
        </div>
    </div>
</form>

打印语句显示:

打印顺序为:

  1. 请求方法
  2. 请求参数
  3. 申请表
  4. 请求文件
  5. 档案变量的类型

档案的大小总是32,不管我上传什么图片,总是32,所以从那时起已经是空的,不知道为什么会空。我正在按照示例进行操作。

https://flask-wtf.readthedocs.io/en/latest/form.html

【问题讨论】:

    标签: python flask flask-wtforms wtforms file-storage


    【解决方案1】:

    首先,文件的大小始终为 32,因为 sys.getsizeof() 以字节为单位返回 Python 用于该对象的内存量,如 docs 中所述。

    要打印您可以使用的实际文件大小:

    os.path.getsize('path')
    

    使用它,您应该会看到打印的文件大小实际上是 0。

    其次,通过删除:

    image_data = archivio.read()
    

    您应该能够成功地将文件保存在所需的位置。

    我不确定您要使用archive.read() 完成什么。

    【讨论】:

    • 好的,对于第一部分,大小,这是否给了我字节对象的大小?还是本地目录中元素的大小?
    • 第二部分,非常感谢。我只是在测试很多东西,而且总是留在那里。你救了我的命。
    【解决方案2】:

    对于刚刚偶然发现这一点的任何人,

    当您对同一个文件对象执行 save() 和 read() 时会发生此错误。

    我通过检查 2 个场景扩展了我的研究:

    1.read() 在 save() 之前

    read() 函数将读取文件并将光标放在文件末尾。如果现在保存此对象,它将为空。

    2。在读取()之前保存()

    文件对象在您成功保存()文件后变为空。如果您现在尝试读取它,您将得到一个空字符串 ''

    3.深拷贝这个文件对象,以便对单独的文件对象执行 read() 和 save()

    不允许。某些文件类型(例如 FileStorage)无法进行深度复制。参考this answer

    解决方法

    根据 Naisarg 在此 answer 中的评论:

    1. 在后台保存文件。

      file = request.files['file']

      file.save(secure_filename(file.filename))

    2. 读取该文件。

    3. 将该文件附加到第 3 方 API。

      r = requests.post(url, headers=headers, data=payload, files={'file': (file.filename, open(file.filename, 'rb'), file.content_type)})

    4. 删除后端文件。

      os.remove(file.filename)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2018-07-05
      • 2013-10-08
      • 2011-11-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-06-27
      相关资源
      最近更新 更多