Flask FileStorage сохранить пустой файл - PullRequest
0 голосов
/ 03 января 2019

Я работаю с 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')

Маршрут / функция колбы:

@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>

Операции печати показывают это: Print results

Порядок отпечатков:

  1. Метод запроса
  2. Аргументы запроса
  3. Форма запроса
  4. Файлы запроса
  5. Тип переменной архива

Размердля archivo всегда 32, неважно, какое изображение я загружаю, всегда 32, поэтому с этого момента уже пусто, не могу понять, почему оно пустое.Я следую за примерами.

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

1 Ответ

0 голосов
/ 03 января 2019

Во-первых, размер вашего файла всегда равен 32, потому что sys.getsizeof () возвращает объем памяти в байтах, который Python использует для этого объекта, как объяснено в документах .

Для печати фактического размера файла вы можете использовать:

os.path.getsize('path')

Используя его, вы должны увидеть, что размер напечатанного файла фактически равен 0.

Во-вторых, удалив:

image_data = archivio.read()

вы сможете успешно сохранить файл в нужном месте.

Я не уверен, чего вы пытаетесь достичь с помощью archivio.read ().

...