繁体   English   中英

如何使用python flask从Google云存储提供图像

[英]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)

我建议您查看您的路线的pathstring转换器的文档 ,并且NamedTemporaryFile默认为delete=True因此没有残基。 如果您给它提供了文件名, flask还会计算出mimetype类型,例如此处的情况。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM