我目前正在开发一个在Appengine标准环境中运行烧瓶的项目,我正在尝试在我项目的默认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云端存储的图像?
编辑:
我实际上是在尝试将我上传到我的应用引擎项目中的默认云存储分区的图像投放。
我还试图使用以下代码提供图像但没有成功:
# 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')
...
答案 0 :(得分:5)
我使用了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')
答案 1 :(得分:2)
你是否想要完成这样的事情:
fichaje_players_match
或
/tlb
需要图片网址,而不是相对路径。您可以重定向到图片网址,但他们会获得301。
答案 2 :(得分: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
转换器的the docs,NamedTemporaryFile
默认为delete=True
,因此不会有任何遗漏。
如果你给它一个文件名,flask
也会计算mimetype
。就像这里的情况一样。