Flask Upload, mehrere Dateien

Django, Flask, Bottle, WSGI, CGI…
Antworten
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

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)))

Sirius3
User
Beiträge: 18255
Registriert: Sonntag 21. Oktober 2012, 17:20

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.
Benutzeravatar
__blackjack__
User
Beiträge: 14012
Registriert: Samstag 2. Juni 2018, 10:21
Wohnort: 127.0.0.1
Kontaktdaten:

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.
“The best book on programming for the layman is »Alice in Wonderland«; but that's because it's the best book on anything for the layman.” — Alan J. Perlis
tz_wuerzburg
User
Beiträge: 71
Registriert: Dienstag 7. März 2017, 17:51

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"
Antworten