Also habe ich mit roher WSGI, cgi.FieldStorage und Datei-Uploads herumgespielt. Und ich kann einfach nicht verstehen, wie es mit Datei-Uploads umgeht.
Zuerst schien es, dass es nur die gesamte Datei im Speicher ablegt. Und ich dachte hm, das sollte einfach zu testen sein - eine große Datei sollte die Erinnerung verstopfen! .. Und das tat es nicht. Dennoch, wenn ich die Datei anfordere, ist es eine Zeichenfolge, kein Iterator, Dateiobjekt oder irgendetwas.
Ich habe versucht, die Quelle des CGI-Moduls zu lesen und einige Dinge über temporäre Dateien gefunden, aber es gibt eine verdammte Zeichenkette zurück, kein Datei-ähnliches Objekt! Also ... wie funktioniert die Arbeit?!
Hier ist der Code, den ich benutzt habe:
%Vor%Vielen Dank im Voraus! :)
Unter CGI-Modulbeschreibung finden Sie einen Abschnitt, in dem Sie erfahren, wie Sie vorgehen sollten Handle Dateiuploads.
%Vor%Wenn ein Feld eine hochgeladene Datei darstellt, wird beim Zugriff auf den Wert über das Attribut value oder die Methode
getvalue()
die gesamte Datei im Speicher als Zeichenfolge gelesen. Dies ist möglicherweise nicht das, was Sie wollen. Sie können eine hochgeladene Datei testen, indem Sie entweder das Attribut filename oder das Attribut file testen. Sie können dann die Daten in Ruhe aus dem Dateiattribut lesen:
In Ihrem Beispiel ist getfirst()
nur eine Version von getvalue()
.
Versuchen Sie,
mit
%Vor%Dadurch wird ein dateiähnliches Objekt zurückgegeben, das "in der Freizeit" lesbar ist.
Der beste Weg ist, die Datei NICHT zu lesen (oder sogar jede Zeile gleichzeitig, wie Gimel vorgeschlagen hat).
Sie können eine Vererbung verwenden und eine Klasse aus FieldStorage erweitern und dann die Funktion make_file überschreiben. make_file wird aufgerufen, wenn FieldStorage vom Typ datei ist.
Für Ihre Referenz sieht default make_file folgendermaßen aus:
%Vor%Anstatt temporäre Dateien zu erstellen, erstellen Sie die Datei permanent dort, wo Sie möchten.
Mit einer Antwort von @hasanatkazmi (in einer Twisted-App) habe ich etwas wie:
%Vor% Beachten Sie, dass die Datei nicht immer vom cgi Modul erstellt wird. Gemäß diesen cgi.py
-Zeilen wird es nur erstellt, wenn der Inhalt 1000 Bytes überschreitet:
Sie müssen also prüfen, ob die Datei tatsächlich mit einer Abfrage für ein% code_% -Feld der benutzerdefinierten Klasse wie folgt erstellt wurde:
%Vor%Wenn% ce_de% auch für das Feld festgelegt wird, was selten scheint, sollte die Datei auch mit cgi erstellt werden.
Das ist es. Auf diese Weise können Sie die Datei vorhersehbar speichern und so den Speicherverbrauch Ihrer App verringern.