2015-08-06 17 views
7

Desidero caricare un file e archiviarlo nel database. Ho creato una colonna LargeBinary.Serve l'immagine memorizzata nella colonna SQLAlchemy LargeBinary

logo = db.Column(db.LargeBinary) 

Ho letto il file caricato e lo memorizzo nel database.

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

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

È questo il modo corretto di memorizzare un'immagine come binario nel database? Come posso convertire nuovamente i dati binari in un'immagine per visualizzarli?

risposta

10

Se è assolutamente necessario memorizzare l'immagine nel database, allora sì, questo è corretto. In genere, i file vengono archiviati nel filesystem e il percorso viene archiviato nel database. Questa è la soluzione migliore perché il server Web in genere ha un metodo efficiente per servire file dal filesystem, a differenza dell'applicazione che invia grandi quantità di dati dinamicamente.


Per servire l'immagine, scrivere una vista che recuperi i dati dell'immagine e li invii come risposta.

@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 }}"/> 

servono Preferibilmente utilizzando il tipo MIME corretto anziché application/octet-stream.


È anche possibile incorporare i dati di immagine direttamente in html utilizzando un data uri. Questo è non ottimale, poiché i dati vengono inviati ogni volta che la pagina viene sottoposta a rendering, mentre un file immagine può essere memorizzato nella cache dal client.

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 }}"/>