簡體   English   中英

Flask FileStorage 保存空文件

[英]Flask FileStorage save empty file

我正在使用 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>

打印語句顯示了這一點: 打印結果

打印順序為:

  1. 請求方式
  2. 請求參數
  3. 申請表
  4. 請求文件
  5. 歸檔變量的類型

存檔的大小總是32,不管我上傳什么圖片,總是32,所以從那時起就已經是空的,還沒弄清楚為什么會空。 我正在按照示例進行操作。

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

首先,文件的大小始終為 32,因為 sys.getsizeof() 返回 Python 用於該對象的內存量(以字節為單位),如文檔中所述。

要打印實際文件大小,您可以使用:

os.path.getsize('path')

使用它,您應該看到打印的文件大小實際上為 0。

其次,通過刪除:

image_data = archivio.read()

您應該能夠成功地將文件保存在所需的位置。

我不確定你想用 archivio.read() 完成什么。

對於剛剛偶然發現這一點的人來說,

當您對同一個文件對象執行 save() 和 read() 時會發生此錯誤。

我通過檢查 2 個場景擴展了我的研究:

1.在保存()之前讀取()

read() 函數將讀取文件並將光標放在文件末尾。 如果這個對象現在被保存,它將是空的。

2.在read()之前保存()

成功保存()文件后,文件對象變為空。 如果你現在嘗試閱讀它,你會得到一個空字符串 ''

3.Deepcopy這個文件對象,以便對單獨的文件對象執行read()和save()

不允許。 某些文件類型(例如 FileStorage)無法進行深度復制。 參考這個答案

解決方法

根據 Naisarg 在此答案中的評論:

  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)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM