Ich schreibe meine erste Anwendung flask. Ich befasse mich mit Datei-Uploads, und im Grunde möchte ich die Daten/den Inhalt der hochgeladenen Datei lesen, ohne sie zu speichern und sie dann auf der resultierenden auszudrucken Ja, ich gehe davon aus, dass der Benutzer immer eine Textdatei hochlädt.
Hier ist die einfache Upload-Funktion, die ich benutze:
@app.route('/upload/', methods=['GET', 'POST'])
def upload():
if request.method == 'POST':
file = request.files['file']
if file:
filename = secure_filename(file.filename)
file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename))
a = 'file uploaded'
return render_template('upload.html', data = a)
Im Moment speichere ich die Datei, aber was ich brauche, ist diese Variable, die den Inhalt/die Daten der Datei enthält. Irgendwelche Ideen?
FileStorage
enthält das Feld stream
. Dieses Objekt muss IO oder Dateiobjekt erweitern, damit es read
und ähnliche Methoden enthält. FileStorage
erweitert auch stream
Feldobjektattribute Sie können also einfach file.read()
anstelle von file.stream.read()
verwenden. Sie können auch das Argument save
mit dem Parameter dst
als StringIO
oder anderes verwenden IO oder zu kopierendes Dateiobjekt FileStorage.stream
zu einem anderen IO oder Dateiobjekt.
Siehe Dokumentation: http://flask.pocoo.org/docs/api/#flask.Request.files und http://werkzeug.pocoo.org/docs/datastructures/# werkzeug.datastructures.FileStorage .
Wenn Sie standardmäßiges Flask Zeug verwenden möchten - es gibt keine Möglichkeit, das Speichern einer temporären Datei zu vermeiden, wenn die hochgeladene Dateigröße> 500 KB ist. Wenn sie kleiner als 500 KB ist, wird "BytesIO" verwendet, welches speichert den Dateiinhalt im Speicher und wenn er größer als 500 KB ist, speichert er den Inhalt in TemporaryFile () (wie in der werkzeug documentation angegeben). In beiden Fällen wird Ihr Skript blockiert, bis der gesamte Upload abgeschlossen ist Datei wird empfangen.
Der einfachste Weg, dies zu umgehen, ist:
1) Erstellen Sie Ihre eigene dateiähnliche IO Klasse, in der Sie die gesamte Verarbeitung der eingehenden Daten durchführen
2) Überschreiben Sie in Ihrem Skript die Request-Klasse mit Ihrer eigenen:
class MyRequest( Request ):
def _get_file_stream( self, total_content_length, content_type, filename=None, content_length=None ):
return MyAwesomeIO( filename, 'w' )
3) Ersetze die request_class von Flask durch deine eigene:
app.request_class = MyRequest
4) Geh und trink ein Bier :)
Für den Fall, dass wir die In-Memory-Datei auf die Festplatte sichern wollen. Dieser Code kann verwendet werden
if isinstanceof(obj,SpooledTemporaryFile):
obj.rollover()