Wie funktioniert cgi.FieldStorage Dateien speichern?
Also ich habe das Spiel mit raw-WSGI, cgi.FieldStorage-und Datei-uploads. Und ich kann einfach nicht verstehen, wie es sich mit Datei-uploads.
Zuerst schien es, dass es speichert die ganze Datei in den Speicher. Und ich dachte, hm, das sollte einfach zu testen - eine große Datei, die sollten verstopfen die Erinnerung!.. Und war es nicht. Dennoch, wenn ich die Datei anzufordern, es ist ein string, nicht einen iterator, file-Objekt oder so etwas.
Ich habe versucht, das Lesen der cgi-Modul Quelle und fand einige Dinge, die zu temporären Dateien, aber es gibt eine verdammt string -, nicht um eine Datei(-like) - Objekt! So... wie sieht es fscking Arbeit?!
Hier ist der code, den ich verwendet habe:
import cgi
from wsgiref.simple_server import make_server
def app(environ,start_response):
start_response('200 OK',[('Content-Type','text/html')])
output = """
<form action="" method="post" enctype="multipart/form-data">
<input type="file" name="failas" />
<input type="submit" value="Varom" />
</form>
"""
fs = cgi.FieldStorage(fp=environ['wsgi.input'],environ=environ)
f = fs.getfirst('failas')
print type(f)
return output
if __name__ == '__main__' :
httpd = make_server('',8000,app)
print 'Serving'
httpd.serve_forever()
Vielen Dank im Voraus! 🙂
Du musst angemeldet sein, um einen Kommentar abzugeben.
Prüfung der cgi-Modul Beschreibung, es ist ein Absatz zu diskutieren, wie zu handhaben Datei-uploads.
Bezüglich deinem Beispiel
getfirst()
ist nur eine version vongetvalue()
.versuchen Sie ersetzen
mit
Diese liefert eine Datei-ähnlichen Objekts, das gelesen werden "in der Freizeit".
Der beste Weg ist, um NICHT die Datei Lesen (oder sogar jede Zeile in einer Zeit, als gimel vorgeschlagen).
Können Sie einige der Vererbung und erweitern Sie eine Klasse aus FieldStorage und dann überschreiben make_file Funktion. make_file wird aufgerufen, wenn FieldStorage-Typ ist Datei.
Für Ihre Referenz, Standard make_file sieht wie folgt aus:
eher dann erstellen temporaryfile, dauerhaft Datei erstellen, wo immer Sie wollen.
Über eine Antwort von @hasanatkazmi (verwertet in ein Twisted-app) ich habe so etwas wie:
Seien Sie gewarnt, dass die Datei nicht immer durch die cgi Modul. Nach diesen
cgi.py
Zeilen, es wird nur dann erstellt, wenn der Inhalt übersteigt 1000 bytes:Also, Sie haben zu prüfen, ob die Datei tatsächlich erstellt wurde mit einer Abfrage für eine benutzerdefinierte Klasse'
path
Feld etwa so:Wenn die
Content-Length
ist auch für das Feld festgelegt ist, scheint selten, sollte die Datei auch erstellt werden, indem cgi.Das ist es. Auf diese Weise können Sie die Datei speichern, wie vorauszusehen war, ist die Verringerung der Speichernutzung Bilanz Ihrer app.