6

Tôi muốn tránh sử dụng ứng dụng web từ GAE, vì vậy tôi sử dụng mã này để tải lên một hình ảnh để các Blobstore (đoạn mã từ: http://flask.pocoo.org/mailinglist/archive/2011/1/8/app-engine-blobstore/#7fd7aa9a5c82a6d2bf78ccd25084ac3b)Phục vụ hình ảnh từ GAE kho dữ liệu với Flask (python)

@app.route("/upload", methods=['POST']) 
def upload(): 
    if request.method == 'POST': 
     f = request.files['file'] 
     header = f.headers['Content-Type'] 
     parsed_header = parse_options_header(header) 
     blob_key = parsed_header[1]['blob-key'] 
     return blob_key 

nó trả về những gì nó có vẻ là thực sự là một Blobkey, mà là một cái gì đó như thế này:

2I9oX6J0U5nBCVw8kEndpw ==

sau đó tôi cố gắng để hiển thị hình ảnh Blob thời gian gần đây được lưu trữ với mã này:

@app.route("/testimgdisplay") 
def test_img_display(): 
    response = make_response(db.get("2I9oX6J0U5nBCVw8kEndpw==")) 
    response.headers['Content-Type'] = 'image/png' 
    return response 

Đáng buồn là phần này không làm việc, tôi nhận được lỗi sau:

BadKeyError: Invalid string key 2I9oX6J0U5nBCVw8kEndpw== 

Do you guys đã phải đối mặt này lỗi trước? Có vẻ như Blobkey được định dạng tốt và tôi không thể tìm thấy manh mối nào.

+0

Tôi nghĩ rằng vấn đề là những gì bạn đang nhận được như blobkey dường như được mã hóa base64. –

+0

Thx, nó đẩy tôi đi đúng hướng;) – Koffee

Trả lời

8

Có một sai lầm đơn giản trên các cuộc gọi để nhận được Blob, tôi đã viết:

db.get("2I9oX6J0U5nBCVw8kEndpw==") 

và gọi đúng là thay vì:

blobstore.get("2I9oX6J0U5nBCVw8kEndpw==") 

Đối với những người tìm kiếm một Tải lên hoàn chỉnh/Phục vụ hình ảnh qua GAE Blobstore và Flask mà không sử dụng ứng dụng web, đây là mã hoàn chỉnh:

Render mẫu đối với hình thức upload:

@app.route("/upload") 
def upload(): 
    uploadUri = blobstore.create_upload_url('/submit') 
    return render_template('upload.html', uploadUri=uploadUri) 

Nơi uploadUri của bạn trong con đường hình thức (html):

<form action="{{ uploadUri }}" method="POST" enctype="multipart/form-data"> 

Dưới đây là chức năng để xử lý các tải lên hình ảnh (tôi trả lại blob_key vì những lý do thực tế, thay thế nó với mẫu của bạn):

@app.route("/submit", methods=['POST']) 
def submit(): 
    if request.method == 'POST': 
     f = request.files['file'] 
     header = f.headers['Content-Type'] 
     parsed_header = parse_options_header(header) 
     blob_key = parsed_header[1]['blob-key'] 
     return blob_key 

Bây giờ nói rằng bạn phục vụ hình ảnh của bạn với một con đường như thế này:

/img/imagefilename

Sau đó, hình ảnh của bạn làm hết chức năng là:

@app.route("/img/<bkey>") 
def img(bkey): 
    blob_info = blobstore.get(bkey) 
    response = make_response(blob_info.open().read()) 
    response.headers['Content-Type'] = blob_info.content_type 
    return response 

Cuối cùng, bất cứ nơi nào bạn cần để hiển thị một hình ảnh trong một mẫu, bạn chỉ cần đặt mã:

<img src="/img/{{ bkey }} /> 
0

Tôi không nghĩ Flask là tốt hơn hoặc tệ hơn Webapp trong việc phân phát hình ảnh Blobstore, vì cả hai đều sử dụng API Blobstore cho Serving a Blob.

Những gì bạn đang gọi điện thoại một Blobkey chỉ là một chuỗi, mà cần phải được chuyển đổi thành một chìa khóa (gọi tắt là resource đây):

from google.appengine.ext import blobstore 
from google.appengine.ext.webapp import blobstore_handlers 
class ServeHandler(blobstore_handlers.BlobstoreDownloadHandler): 
    def get(self, resource): 
     resource = str(urllib.unquote(resource)) 
     blob_info = blobstore.BlobInfo.get(resource) 
     self.send_blob(blob_info) 
Các vấn đề liên quan