[英]How to serve an image from google cloud storage using python flask
I'm currently working on a project running flask on the Appengine standard environment, and I'm attempting to serve an image that has been uploaded onto Google Cloud Storage on my project's default Appengine storage bucket. 我目前正在一个在Appengine标准环境下运行flask的项目中工作,并且正在尝试在我的项目的默认Appengine存储分区中提供已上传到Google Cloud Storage的图像。
This is the routing code I currently have: 这是我目前拥有的路由代码:
# 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)
...
However, I am getting an AttributeError: 'Image' object has no attribute 'read'
error. 但是,我得到了
AttributeError: 'Image' object has no attribute 'read'
错误。
The question is, how do I serve an image sourced from google cloud storage using an arbitrary route using python and flask? 问题是,如何使用python和flask的任意路由来提供来自Google云存储的图像?
EDIT: 编辑:
I am actually trying to serve an image that I have uploaded to the default Cloud Storage Bucket in my app engine project. 我实际上是在尝试提供已上传到我的App Engine项目中默认云存储桶中的图像。
I've also tried to serve the image using the following code without success: 我还尝试使用以下代码为图片提供服务,但未成功:
# 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')
...
I've used the GoogleAppEngineCloudStorageClient
Python library and loaded images with code similar to the following example: 我使用了
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')
Are you trying to accomplish something like this: 您是否正在尝试完成以下操作:
@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
or 要么
return send_file(img) # download file
The image url is needed, not a relative path. 图片网址是必需的,而不是相对路径。 You could just do a redirect to the image url, but they would get a 301.
您可以直接重定向到图片网址,但会收到301。
Using google-cloud-storage==1.6.0 使用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)
I recommend looking at the docs for the path
or string
converters for your route, and NamedTemporaryFile
defaults to delete=True
so no residue. 我建议您查看您的路线的
path
或string
转换器的文档 ,并且NamedTemporaryFile
默认为delete=True
因此没有残基。 flask
also figures out the mimetype
if you give it a file name, as is the case here. 如果您给它提供了文件名,
flask
还会计算出mimetype
类型,例如此处的情况。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.