2015-05-14 22 views
6

Sto utilizzando il pallone e sqlalchemy e sto riscontrando problemi relativi al caricamento dei file.Flask e sqlalchemy: scarica il file utilizzando il percorso memorizzato nel database

Sto caricando il file con un modulo e memorizzando l'URL nel DB, così posso visualizzarlo all'interno della pagina.

Ecco il codice del form:

 boxart = request.files['boxart'] 

     if boxart: 
      filename = secure_filename(boxart.filename) 
      boxart_path = os.path.join(app.config['UPLOAD_FOLDER']+"boxart/", filename) 
      boxart.save(boxart_path) 
      game_son.boxart = boxart_path 

     db.session.add(game_son) 
     db.session.commit() 

così vado al mio modello e posso stampare il contenuto di game_son.boxart e non v'è il percorso completo del file. Se clicco sul link, posso accedere, ma l'immagine non verrà visualizzata tag all'interno ...

ho provato ottenerlo sul modello utilizzando:

<img src="{{ game_son.boxart_url() }}" /> 

all'interno del modello, ho definito un metodo boxart_url, nel caso in cui ho bisogno di analizzare la stringa prima di inviarlo

class Game_son(db.Model): 
    __searchable__ = ['version_name'] 
    son_id = db.Column(db.Integer, primary_key=True) 
    version_name = db.Column(db.String(128), index=True, unique=False) 
    son_timestamp = db.Column(db.DateTime) 
    dad = db.Column(db.Integer, db.ForeignKey('game_dad.id')) 
    console = db.Column(db.Integer, db.ForeignKey('platform.id')) 
    boxart = db.Column(db.String(256)) 
    thumbnail = db.Column(db.String(256)) 
    genre = db.Column(db.String(32)) 
    subgenre = db.Column(db.String(32)) 

    def boxart_url(self): 
     return self.boxart 

    def __repr__(self): 
     return '<Game %r>: %r' % (self.version_name, self.dad) 

vista della pagina è sufficiente inviare l'intero oggetto (gioco) alla pagina.

l'URL che sta arrivando sulla pagina è:

/home/removed_my_pc_user/app/media/boxart/image.jpg

Edit: ho appena ricordato che sto usando un ambiente virtuale sul progetto.

E 'collegato a chmod?

Grazie in anticipo !!

+0

Dov'è il codice che mostra l'immagine nel modello? Come stai recuperando i dati dal database? Hai fornito la dichiarazione di inserimento, ma questo non ci aiuta a risolvere il tuo problema perché non viene visualizzato nel tag immagine. – CodeLikeBeaker

+0

Grazie. Ho aggiunto più informazioni nella domanda. Se c'è qualcos'altro, dimmelo. – Felipe

+0

Quando si visualizza l'origine, qual è lo src per il tag img? – CodeLikeBeaker

risposta

1

Beh, è ​​strano ma risponderò alla mia domanda.

La soluzione è semplice, ho scelto di memorizzare solo i nomi dei file all'interno del database.

Poi ho creato un percorso per una vista che restituirà il file utilizzando la funzione send_from_directory da flask.ext.uploads

@app.route('/boxart/<filename>') 
    def uploaded_boxart(filename): 
     return send_from_directory(app.config['UPLOAD_FOLDER'],filename) 

Così, all'interno del template che possiamo usare la funzione url_for() per caricare il file, l'invio come parametro il nome del file memorizzato nel database.

<img src="{{ url_for('uploaded_boxart', filename = game_son.boxart)}}" /> 

Inoltre, penso che uno dei miei errori stava mettendo la cartella media/ all'interno della cartella app/, e non all'interno della directory principale. Quindi ho riconfigurato anche lo UPLOAD_FOLDER in app.config.