2015-08-06 12 views
7

Ich möchte eine Datei hochladen und in der Datenbank speichern. Ich habe eine LargeBinary-Spalte erstellt.Serve Bild gespeichert in SQLAlchemy LargeBinary Spalte

Ich lese die hochgeladene Datei und speichern Sie sie in der Datenbank.

files = request.files.getlist('file') 

if files: 
    event.logo = files[0].file.read() 

Ist dies der richtige Weg, um ein Bild als Binärdatei in der Datenbank zu speichern? Wie wandle ich die Binärdaten wieder in ein Bild um es anzuzeigen?

Antwort

10

Wenn Sie das Bild unbedingt in der Datenbank speichern müssen, dann ist dies korrekt. In der Regel werden Dateien im Dateisystem gespeichert und der Pfad wird in der Datenbank gespeichert. Dies ist die bessere Lösung, da der Webserver typischerweise eine effiziente Methode zum Bereitstellen von Dateien aus dem Dateisystem bietet, im Gegensatz zu der Anwendung, die große Datenblobs dynamisch sendet.

Um das Bild zu liefern, schreiben Sie eine Ansicht, die die Bilddaten erhält und als Antwort sendet.

@app.route('/event/<int:id>/logo') 
def event_logo(id): 
    event = Event.query.get_or_404(id) 
    return app.response_class(event.logo, mimetype='application/octet-stream') 
<img src="{{ url_for('event_logo', id=event.id }}"/> 

Vorzugsweise dienen sie den richtigen MIME-Typ verwenden, anstatt application/octet-stream.


Sie könnten auch einbetten, die Bilddaten direkt in den HTML-Code ein Daten uri verwenden. Dies ist suboptimal, da Datenuris jedes Mal gesendet werden, wenn die Seite gerendert wird, während eine Bilddatei vom Client zwischengespeichert werden kann.

from base64 import b64encode 

@app.route('/event/<int:id>/logo') 
def event_logo(id): 
    event = Event.query.get_or_404(id) 
    image = b64encode(event.logo) 
    return render_template('event.html', event=event, logo=image) 
<p>{{ obj.x }}<br/> 
{{ obj.y }}</p> 
<img src="data:;base64,{{ logo }}"/> 
Verwandte Themen