Seite 1 von 1

Flask Upload, mehrere Dateien

Verfasst: Mittwoch 16. Oktober 2019, 11:06
von tz_wuerzburg
Hallo Leute,
ich möchte mehrere Dateien über meine Webseite auf den Server laden. Ich bekomme es leider nicht zum laufen.

Code: Alles auswählen

{% extends "layouts/main.html" %}
{% block content %}
    <br>
    <br>
    <form method=post enctype=multipart/form-data>
        Projektname
        <input type="text" name="projectname">
        <br>
        File 1:
        <input type="file" name="file1">
        <br><br>
        File 2:
        <input type="file" name="file2">
        <br><br>
        File 3:
        <input type="file" name="file3">
        <br><br>
        File 4:
        <input type="file" name="file4">
        <br><br>
        <input type="submit" value="Dateien importieren"><br>
    </form>
{% endblock %}

Code: Alles auswählen

from flask import Flask, render_template, request, flash, redirect, url_for, send_from_directory, send_file
from werkzeug.utils import secure_filename
from pathlib import Path
import time

upload_folder = Path.cwd() / "upload"
allowed_extensions = set(["txt", "csv"])

app = Flask(__name__)

def allowed_file(filename):
    return "." in filename and \
        filename.rsplit(".", 1)[1].lower() in allowed_extensions
        
@app.route("/omm_be", methods=["GET", "POST"])
def omm_be():

    if request.method == "POST":
        upload_files = [request.files["file1"], request.files["file2"], request.files["file3"], request.files["file4"]]

        for file in upload_files:
            if file not in request.files:
                return redirect(request.url)
            file = request.files[file]
            if file.filename == "":
                return redirect(request.url)
            if allowed_file(file.filename):
                be_timestamp = time.strftime("%Y%m%d_%H%M%S")
                filename = secure_filename(file.filename)
                projectname = request.form["projectname"]
                database_import.be_create_project_folder(projectname, be_timestamp, upload_folder)
                file.save(str(database_import.be_open_project_folder(projectname, be_timestamp, upload_folder) /database_import.be_file_name(filename, be_timestamp)))


Re: Flask Upload, mehrere Dateien

Verfasst: Mittwoch 16. Oktober 2019, 12:39
von Sirius3
Was heißt "nicht zum Laufen bringen"? Was passiert? Gibt es eine Fehlermeldung? Browser-Logs? Server-Logs? Kompletter relevanter Code?

Du benutzt schon `pathlib`? Warum hast Du dann so eine komplizierte `allowed_file`-Funktion?
Den sinn von uploaded_files und die if-Abfrage verstehe ich nicht. Wenn Du Einträge aus request.files nimmst, dann sind die auch immer drin. Ein filename kann, muß aber nicht mit übertragen werden.`be_timestamp` sollte man nur einmal vor der for-Schleife ermitteln. Was soll eigentlich das kryptische be_-Präfix? Benutze keine Abkürzungen.

Re: Flask Upload, mehrere Dateien

Verfasst: Mittwoch 16. Oktober 2019, 12:48
von __blackjack__
Ergänzend: `secure_filename()` kann auch eine leere Zeichenkette als Ergebnis liefern. Diesen Fall sollte man entsprechend behandeln.

Edit: Und auch ob der Dateiname schon existiert, denn diese Funktion kann ja verschiedene Dateinamen auf das gleiche Ergebnis abbilden.

Re: Flask Upload, mehrere Dateien

Verfasst: Mittwoch 16. Oktober 2019, 16:34
von tz_wuerzburg
Vielen Dank für Eure Hilfe! Jetzt funktioniert es wie gewollt.
Es wird nun ein Projektordner erstellt und die Daten werden in diesen geschrieben. be ist eine interne Bezeichnung, ich werde mir aber noch was besseres einfallen lassen.
@blackjack. Danke für die Hinweise, dass werde ich noch erledigen.

Code: Alles auswählen

@app.route("/omm_be", methods=["GET", "POST"])
def omm_be():

    if request.method == "POST":
        be_timestamp = time.strftime("%Y%m%d_%H%M%S")
        projectname = request.form["projectname"]
        belgium_database_import.be_create_project_folder(projectname, be_timestamp, upload_folder)
        for file in request.files:
            file = request.files[file]
            if file.filename == "":
                return redirect(request.url)
            if allowed_file(file.filename):
                filename = secure_filename(file.filename)
                file.save(str(be_database_import.be_open_project_folder(projectname, be_timestamp, upload_folder) / be_database_import.be_file_name(filename, be_timestamp)))

    return render_template("omm_be.html"