1

I am trying to allow a user to upload multiple files at once in Flask - which will then be saved and processed. Currently, it is working with with a single file upload. I tried to implement a solution based on other things I have read online, such as here but it still only processes one file. The below is said attempt at a solution:


@app.route('/', methods=['POST', 'GET'])
def file_upload():
    if request.method == "POST":
        print("method is post")
        if request.files:
            for file_to_upload in request.files.getlist("uploaded_file"):  
                file_to_upload.seek(0, os.SEEK_END)
                file_length = file_to_upload.tell()
                filename = secure_filename(file_to_upload.filename)
                if file_to_upload.filename == "": # Checks the file name isn't blank
                    print("File name must not be blank")
                    return redirect(request.url)
                elif not allowed_ext(file_to_upload.filename): # Checks the file has an allowed extension
                    print("File extension not supported")
                    return redirect(request.url)
                elif file_length > app.config['MAX_FILE_SIZE']: # Checks file size
                    print("File too big")
                    return redirect(request.url)
                else: # Else, passes all validation and is saved.
                    file_to_upload.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
                    return render_template('index.html', succ="Your file(s) are now being processed.")
        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')
    

def allowed_ext(filename):
    if not "." in filename:
        return False

    ext = filename.rsplit(".", 1)[1]

    if ext.upper() in app.config["ALLOWED_EXTENSIONS"]:
        return True
    else:
        return False

def check_file_name(filename):
    pass
<!-- Allows the user to upload their files for processing -->
<div class="tile is-vertical is-parent coach" id='fileUploadTile'>
    <div class="tile is-child box has-background-light">
      <div>
        <div class="columns">
            <div class="column is-one-third"></div>
            <div class="column is-one-third">
              
                <div id='fileUploader' class="file has-name is-boxed is-centered">
                  <form action='/' method='POST' enctype="multipart/form-data">
                  <label class="file-label">
                    
                      <input class="file-input"  type="file" multiple name="uploaded_file" id='fileLoader'>
                      <span class="file-cta">
                        <span class="file-icon">
                          <i class="fas fa-upload"></i>
                        </span>
                        <span class="file-label">
                          Select file(s) to parse!
                        </span>
                      </span>
                      <span class="file-name">
                        
                      </span>
                    </label>
                  </div>
                  <div>Or simply drag and drop!</div>
            </div>
            {% if success_msg is defined %}
            {{success_msg}}
            {% endif %}
            <div class="column is-one-third"></div>
          </div>
          <div class='buttons are-medium' id='fileButtons'> 
            
          
              
            <input type='submit' class="button is-success is-light" value='Process file(s)'> 
          </form>
          <button class='button is-danger is-light' name='resetFiles' id='resetFiles'>Reset Files</button>
          </div>
    </div>
  </div> <!-- end of column-->

</div>

Any and all help would be much appreciated :)

1 Answer 1

2

The problem with your attempt has nothing to do with Flask - it is a "Python" problem.

You iterate over all uploaded files, but you break the for-loop with the return statement (return render_template(...).

So, you have to iterate over all files, and then, only outside the for-loop return.

Simple example

for fruit in ['apple', 'bananas']:
    print(fruit)
    return  # too early!!
for fruit in ['apple', 'bananas']:
    print(fruit)
return  # <- right time to return
Sign up to request clarification or add additional context in comments.

2 Comments

Thank you! Will have a play around and hopefully fix it :)
Great! Glad to hear!

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.