2012-06-29 9 views
12

flask kullanıyorum ve sadece makinemde (yerel sunucu) çalışan hızlı başlangıç ​​öğreticisini kullanarak çok basit bir şey yapmaya çalışıyorum. Bir görüntü dosyasını başarıyla yükleyen basit bir yükleme formu üretiyorum. Daha sonra bu resmi bir sayfa içinde görüntülemek için template.html değişkenine bir değişken olarak aktarmak istiyorum. template.html dosyası düzgün görüntülenir, ancak görüntü her zaman broken link image symbol olur. Bir dizi farklı yol denedim, ama bir şeyler yapıyorum biraz yanlış yapıyorum.Yüklenmiş görüntüyü Flask'ta template.html'ye aktarma

import os 
from flask import Flask, request, redirect, url_for, send_from_directory, 
        render_template 

UPLOAD_FOLDER = '/home/me/Desktop/projects/flask/uploads' 
ALLOWED_EXTENSIONS = set(['txt', 'pdf', 'png', 'jpg', 'jpeg', 'gif']) 

app = Flask(__name__) 
app.config['UPLOAD_FOLDER'] = UPLOAD_FOLDER 

def allowed_file(filename): 
    return '.' in filename and \ 
      filename.rsplit('.', 1)[1] in ALLOWED_EXTENSIONS 

@app.route('/', methods=['GET', 'POST']) 
def upload_file(): 
    if request.method == 'POST': 
     file = request.files['file'] 
     if file and allowed_file(file.filename): 
      filename = secure_filename(file.filename) 
      file.save(os.path.join(app.config['UPLOAD_FOLDER'], filename)) 
      return redirect(url_for('uploaded_file', filename=filename)) 
    return ''' 
    <!doctype html> 
    <title>Upload new File</title> 
    <h1>Upload new File</h1> 
    <form action="" method=post enctype=multipart/form-data> 
     <p><input type=file name=file> 
     <input type=submit value=Upload> 
    </form> 
    ''' 

@app.route('/uploads/<filename>') 
def uploaded_file(filename): 
    filename = 'http://127.0.0.1:5000/uploads/' + filename 
    return render_template('template.html', filename = filename) 

if __name__ == '__main__': 
    app.run() 

Bu template.html geçerli:

<!doctype html> 
<title>Hello from Flask</title> 
{% if filename %} 
    <h1>some text<img src="{{filename}}"> more text!</h1> 
{% else %} 
    <h1>no image for whatever reason</h1> 
{% endif %} 

Ben template.html yüklenen görüntü dosyasını geçebilir Nasıl yani doğru gösterecektir? Şimdi ne oluyor

Teşekkür

cevap

15

/uploads/foo.jpg template.html içindeki HTML sunduğundan olduğunu. Orada img etiketinin kaynağı olarak /uploads/foo.jpg kullanmayı deneyin. Asıl görüntüyü hiçbir yere götüremezsin.

Bunu şu şekilde değiştirelim: /show/foo.jpg HTML sayfasını döndürür ve /uploads/foo.jpg görüntüyü döndürür. Bu ikisi de ikinci rotayı değiştirin ve gitmek iyi olmalı:

@app.route('/show/<filename>') 
def uploaded_file(filename): 
    filename = 'http://127.0.0.1:5000/uploads/' + filename 
    return render_template('template.html', filename=filename) 

@app.route('/uploads/<filename>') 
def send_file(filename): 
    return send_from_directory(UPLOAD_FOLDER, filename) 
+0

bakacağız ama send_file zaman her bununla denilen sonun py dosyasında from werkzeug import secure_filename bu eksik ilave? – Uzebeckatrente

+0

@Uzebeckatrente, şablondaki "" etiketi "/ uploads/" ifadesine yönlendirilir ve bu da send_file öğesine yönlendirilir. – Miikka

+0

Merhaba @Miikka Bunu bulut sunucusunda deniyorum. Aynı mantık benim için çalışmıyor. Src etiketinin içinde tam görüntü yolunu gösterir. Bir şey önerebilir misin lütfen? –

6

uploaded_file fonksiyonu itibaren hangi edecek biz send_file işlevini vurmak biz template.html başa ve orada geri geliyor geri <img src="{{ url_for('send_file', filename=filename) }}"> yönlendirilir olacak Belirtilen UPLOAD_FOLDER içine yüklenen ve saklanan resim içeren şablonun içindeki HTML’nin içeriğini göster. Ayrıca

@app.route('/show/<filename>') 
def uploaded_file(filename): 
    return render_template('template.html', filename=filename) 

@app.route('/uploads/<filename>') 
def send_file(filename): 
    return send_from_directory(UPLOAD_FOLDER, filename) 

Şimdi template.html Belki de bu saçma bir soru olduğunu .. Böyle

<!doctype html> 
<title>Hello from Flask</title> 
{% if filename %} 
    <h1>some text <img src="{{ url_for('send_file', filename=filename) }}">more text!</h1> 
{% else %} 
    <h1>no image for whatever reason</h1> 
{% endif %} 
İlgili konular