wake-up-neo.net

Lesen Sie die Dateidaten, ohne sie in Flask

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?

83
user2480542

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 .

105
tbicr

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

9
Dimitry Miles

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

0
lalit