2015-05-14 18 views
6

Flask ve sqlalchemy kullanıyorum ve dosya yükleme konusunda sorun yaşıyorum.Flask and sqlalchemy: Veritabanında saklanan yolu kullanarak karşıya yüklenen dosyayı alın

Dosyayı bir formla yüklüyorum ve URL'yi DB'ye saklıyorum, böylece sayfanın içinde görüntüleyebiliyorum.

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

Yani benim şablonuna gidip game_son.boxart içeriğini yazdırabilirsiniz ve dosyanın tam yolunu vardır:

İşte formun kod. Ben linke tıklarsanız, ben kullanarak şablona onu elde çalıştım

... Ben erişebilir ancak görüntü içeride etiketi görüntülemez:

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

modeli içinde, ben tanımlanan bir boxart_url yöntem durumunda bunun

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) 

sayfanın görünüm sadece sayfasına bütün nesneyi (oyun) göndermek göndermeden önce dize ayrıştırmak gerekir.

sayfada varıyor url geçerli:

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

Düzenleme: şimdi hatırladım ben kullanıyorum bir proje üzerinde sanal ortam.

Bu chmod ile ilişkili midir?

şimdiden teşekkür ederiz !!

+0

Şablonunuzdaki görüntüyü gösteren kodunuz nerede? Verileri veritabanından nasıl geri alıyorsunuz? Ekleme bildirimini sağladınız, ancak bu, sorununuzu, resim etiketinde gösterilmemesiyle çözmemize yardımcı olmaz. – CodeLikeBeaker

+0

Teşekkür ederim. Soruya daha fazla bilgi ekledim. Başka bir şey varsa, söyle bana. – Felipe

+0

Kaynağı görüntülediğinizde, img etiketinizin src'si nedir? – CodeLikeBeaker

cevap

1

Bu garip ama kendi sorumu cevaplayacağım.

Çözüm basittir, yalnızca veritabanı içindeki dosya isimlerini saklamayı seçtim.

Sonra bir parametre olarak gönderme Yani, şablonu içinde biz dosyayı yüklemek için url_for() işlevini kullanabilirsiniz flask.ext.uploads

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

den send_from_directory fonksiyonunu kullanarak dosyayı döndüren bir görünüme rota yarattı veritabanında saklanan dosya adı.

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

Ayrıca, benim hatalardan biri kök dizin içinde app/ klasörünün içindeki medya/ klasörü koyarak ve olmadığını düşünüyorum. Bu yüzden de app.config dosyasında UPLOAD_FOLDER'u yeniden yapılandırdım.

İlgili konular