Flask - Пустые файлы при загрузке - PullRequest
0 голосов
/ 11 июля 2020

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

Я только что понял, теперь, когда я пытаюсь реализовать часть обработки системе, что файлы при загрузке пусты, и я не уверен, где это происходит. Файлы успешно названы и помещены в каталоги, но пусты.

Любая помощь будет принята с благодарностью.

Форма html для загрузки:

<div class="tile is-vertical is-parent coach" id='fileUploadTile'>
  <div class="tile is-child box has-background-light">

      <form action='/' method='POST' enctype="multipart/form-data">
        <div class='drop-zone'>
          <span class='drop-zone__prompt is-family-monospace'>Drag and drop or click here to upload files</span>

          <input class="drop-zone__input" type="file" multiple name="uploaded_file" id='fileLoader'>

        </div> <!-- end of drop-zone-->
        <div class='buttons are-medium' id='fileButtons'>
          <input type='submit' class="button is-success is-light is-outlined is-family-monospace" id='submitFiles' value='Process file(s)'>
          </form>
          <button class='button is-danger is-light is-outlined is-family-monospace' name='resetFiles' id='resetFiles'>Reset File(s)</button>
        </div> <!-- end of buttons -->
       
    </div> <!-- end of tile is-child -->
   

  </div> <!-- end of tile is-vertical -->

Код, который пытается проверить файлы (проверить расширения, размер файла, имя и т. Д. c), а затем сохранить:

def file_upload():
    if session:
        session_name = session.get('public_user')
        print("New request from " + str(session_name))
        # update when last request was sent
        active_sessions[session_name] = datetime.now()
    else:
        session_token = generate_session_token()
        print("Generating new session... " + session_token)
        session['public_user'] = session_token  # session = key, last request = value
        active_sessions[session_token] = datetime.now()
        os.mkdir('uploads/'+session['public_user']) #create directory for uploaded files

    if request.method == "POST":
        if request.files:
            files_processed = True
            files = request.files.getlist("uploaded_file")
            upload_path = app.config['UPLOAD_FOLDER'] + \
                str(session['public_user'])
            # loop, as possibility of multiple file uploads
            for file_to_upload in files:
                file_to_upload.seek(0, os.SEEK_END)
                file_length = file_to_upload.tell()
                file_name = check_existing_file_name(file_to_upload.filename)
                # Secures file name against user input
                file_name = secure_filename(file_name)
                # Checks the file name isn't blank
                if file_to_upload.filename == "":
                    print("Error with file" + file_to_upload.filename +
                          " - name must not be blank")
                    files_processed = False
                    continue
                # Checks the file has an allowed extension
                elif not allowed_ext(file_to_upload.filename):
                    print("Error with file" + file_to_upload.filename +
                          " - extension not supported")
                    files_processed = False
                    continue
                # Checks file size
                elif file_length > app.config['MAX_FILE_SIZE']:
                    print("Error with file" +
                          file_to_upload.filename + " file too big")
                    files_processed = False
                    continue
                else:  # Else, passes all validation and is saved.
                    file_path = upload_path + "/" + file_name
                    file_to_upload.save(file_path) 
            # If files have been processed, return a render with success message
            if files_processed is True:
                return render_template('index.html', is_home='yes', succ="Now processing your files...")
            else:  # Else, normal redirect.
                return redirect(request.url)
        else:  # If no files request, redirect to index.
            return redirect(request.url)
    else:  # If not a POST request, load page as normal.
        return render_template('index.html', is_home='yes')

Извините, если это что-то легкое или глупое, которое я пропустил - это это мой первый проект в Python и я впервые использую Flask.

1 Ответ

1 голос
/ 11 июля 2020

Все выглядит вполне нормально.

Несвязано: я бы проверил пустое имя файла против file_name - не file_to_upload.filename.

О вашей проблеме: единственное разумное Ответ может заключаться в том, что при любом из ваших многочисленных действий вы помещаете указатель файла в конец файла, и save не может его обработать.

К сожалению, у меня нет времени попробовать это на моем p c, поэтому, пожалуйста, сделайте seek 0 еще раз - на этот раз непосредственно перед вызовом метода save.

Я попробую это позже и соответствующим образом обновлю свой ответ.

Другой способ найти из того, что происходит, используется отладчик. Это не слишком сложно.

Я снял 5-минутное видео - только для отладки Flask: https://www.youtube.com/watch?v=DB4peJ1Lm2M

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...