![](/img/trans.png)
[英]Display image from google cloud storage in flask website hosted on google cloud using python 3
[英]How to serve an image from google cloud storage using python flask
我目前正在一个在Appengine标准环境下运行flask的项目中工作,并且正在尝试在我的项目的默认Appengine存储分区中提供已上传到Google Cloud Storage的图像。
这是我目前拥有的路由代码:
# main.py
from google.appengine.api import images
from flask import Flask, send_file
app = Flask(__name__)
...
@app.route("/sample_route")
def sample_handler():
myphoto = images.Image(filename="/gs/myappname.appspot.com/mysamplefolder/photo.jpg")
return send_file(myphoto)
...
但是,我得到了AttributeError: 'Image' object has no attribute 'read'
错误。
问题是,如何使用python和flask的任意路由来提供来自Google云存储的图像?
编辑:
我实际上是在尝试提供已上传到我的App Engine项目中默认云存储桶中的图像。
我还尝试使用以下代码为图片提供服务,但未成功:
# main.py
from google.appengine.api import images
from flask import Flask, send_file
app = Flask(__name__)
...
@app.route("/sample_route")
def sample_handler():
import cloudstorage as gcs
gcs_file = gcs.open("/mybucketname/mysamplefolder/photo.jpg")
img = gcs_file.read()
gcs_file.close()
return send_file(img, mimetype='image/jpeg')
...
我使用了GoogleAppEngineCloudStorageClient
Python库,并使用类似于以下示例的代码加载了图像:
from google.appengine.api import app_identity
import cloudstorage
from flask import Flask, send_file
import io, os
app = Flask(__name__)
# ...
@app.route('/imagetest')
def test_image():
# Use BUCKET_NAME or the project default bucket.
BUCKET_NAME = '/' + os.environ.get('MY_BUCKET_NAME',
app_identity.get_default_gcs_bucket_name())
filename = 'mytestimage.jpg'
file = os.path.join(BUCKET_NAME, filename)
gcs_file = cloudstorage.open(file)
contents = gcs_file.read()
gcs_file.close()
return send_file(io.BytesIO(contents),
mimetype='image/jpeg')
您是否正在尝试完成以下操作:
@app.route("/sample_route")
def sample_handler():
import urllib2
import StringIO
request = urllib2.Request("{image url}")
img = StringIO.StringIO(urllib2.urlopen(request).read())
return send_file(img, mimetype='image/jpeg') # display in browser
要么
return send_file(img) # download file
图片网址是必需的,而不是相对路径。 您可以直接重定向到图片网址,但会收到301。
使用google-cloud-storage == 1.6.0
from flask import current_app as app, send_file, abort
from google.cloud import storage
import tempfile
@app.route('/blobproxy/<filename>', methods=['GET'])
def get(filename):
if filename:
client = storage.Client()
bucket = client.get_bucket('yourbucketname')
blob = bucket.blob(filename)
with tempfile.NamedTemporaryFile() as temp:
blob.download_to_filename(temp.name)
return send_file(temp.name, attachment_filename=filename)
else:
abort(400)
我建议您查看您的路线的path
或string
转换器的文档 ,并且NamedTemporaryFile
默认为delete=True
因此没有残基。 如果您给它提供了文件名, flask
还会计算出mimetype
类型,例如此处的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.