Файл пуст после сохранения загрузок в колбу - PullRequest
0 голосов
/ 02 июня 2018

Я пытался загрузить файл с помощью форм Flask и HTML.Теперь я могу сохранить загруженный файл, но он отображается пустым (0 байт).После этого я сохраняю записи формы в базе данных.

Так что я застрял при сохранении файла.Это код Python

@app.route('/handle_data', methods=['POST'])
def handle_data():

naam = request.form['naam']
leeftijd = request.form['leeftijd']
gewicht = request.form['gewicht']
geslacht = request.form['geslacht']

filename = "x"
if request.method == 'POST' and 'photo' in request.files:
    filename = photos.save(request.files['photo'])
    photos.save(request.files['photo'], opslag)


cur = mysql.connect()
cursor = cur.cursor()

cursor.execute("INSERT INTO gekko (naam, leeftijd, gewicht, geslacht, foto) VALUES (%s, %s, %s, %s, %s)", (naam, leeftijd, gewicht, geslacht, filename))
# cursor.execute("INSERT INTO gekko (naam, leeftijd, gewicht) VALUES (" + str(naam) + "," + leeftijd + "," + gewicht + ")")

cur.commit()
cursor.close()
cur.close()

return "added"

HTML-форма:

{% extends "base.html" %}
{% block body %}
<form action="{{ url_for('handle_data') }}" enctype=multipart/form-data 
method="POST">
  Naam van de gekko:<br>
  <input type="text" name="naam">
  <br>
  Leeftijd van de gekko:<br>
  <input type="text" name="leeftijd">
    <br>
  Gewicht van de gekko:<br>
  <input type="text" name="gewicht">
    <br>
  Geslacht van de gekko:<br>
  <input type="radio" name="geslacht" value="man"> Man
    <input type="radio" name="geslacht" value="vrouw"> Vrouw<br>
    <br>
    <input type="file" id="photo" name="photo">
    <br>
    <input type="submit" value="Submit">

</form>
{% endblock %}

Ответы [ 2 ]

0 голосов
/ 16 октября 2018

Я понял, что у колбы есть привычка включать одну пустую загрузку файла с точно таким же именем и деталями, как у одного из файловых вложений (обычно это первое вложение), КОГДА вы используете в форме атрибут «множественный».

Мой обходной путь заключался в

  1. создании временного случайного имени файла и сохранении файла для загрузки
  2. с использованием os.stat (имя_файла_имя) .st_size, чтобы проверить, является ли файл пустым
  3. если файл пустой, удалите его с помощью os.remove, в противном случае переименуйте файл на предпочитаемое [безопасное] имя файла

пример ...

# ...

def upload_file(req):
    if req.method != 'POST': return

    # file with 'multiple' attribute is 'uploads'
    files = req.files.getlist("uploads")

    # get other single file attachments
    if req.files:
        for f in req.files: files.append(req.files[f])

    for f in files:

        if not f.filename: continue

        tmp_fname = YOUR_TEMPORARY_FILENAME
        while os.path.isfile(tmp_fname):
            # you can never rule out the possibility of similar random 
            # names
            tmp_fname = NEW_TEMPORARY_FILENAME

        # TEMP_FPATH is he root temporary directory
        f.save(os.path.join(TEMP_FPATH, tmp_fname))

        # and here comes the trick
        if os.stat(os.path.join(TEMP_FPATH, tmp_fname)).st_size:
            os.system("mv \"{}\" \"{}\" > /dev/null 2> /dev/null".format(
                os.path.join(TEMP_FPATH, tmp_fname),
                os.path.join(ACTUAL_FILEPATH, f.filename))
            ))
        else:
            # cleanup
            os.remove(os.path.join(TEMP_FPATH, tmp_fname))
            pass

@app.route("/upload", methods=["POST"])
def upload():
    upload_files(request)

    return "files are uploaded!"

# ...
0 голосов
/ 03 июня 2018

Мы на самом деле не знаем, что такое класс photos, и что делает его метод save, но именно здесь, вероятно, и возникает ошибка.

Попробуйте вместо этого:

request.files['photo'].save('test.jpg')
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...