下载图片数据,然后上传到Google云端存储

时间:2016-08-24 22:55:40

标签: python-2.7 google-app-engine flask python-requests google-cloud-storage

我有一个在Google AppEngine上运行的Flask网络应用。该应用程序有一个表单,我的用户将用它来提供图像链接。我想从链接下载图像数据,然后将其上传到Google Cloud Storage存储桶。

到目前为止,我在Google的文档中发现的内容告诉我要使用' cloudstorage'我已安装并导入的客户端库' gcs'。
在这里找到:https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/read-write-to-cloud-storage

我认为我没有通过请求正确处理图像数据。我从云存储上传调用中获得了200个代码,但是当我在控制台中查找它时没有对象。这是我尝试检索图像然后上传它的地方:

img_resp = requests.get(image_link, stream=True)
objectName = '/myBucket/testObject.jpg'

gcs_file = gcs.open(objectName,
                    'w',
                    content_type='image/jpeg')
gcs_file.write(img_resp)
gcs_file.close()

编辑: 以下是我更新的代码,以反映答案的建议:

image_url = urlopen(url)
content_type = image_url.headers['Content-Type']
img_bytes = image_url.read()
image_url.close()

filename = bucketName + objectName
options = {'x-goog-acl': 'public-read',
           'Cache-Control': 'private, max-age=0, no-transform'}

with gcs.open(filename,
              'w',
              content_type=content_type,
              options=options) as f:
    f.write(img_bytes)
    f.close()

但是,我仍然在POST(创建文件)调用上获得201响应,然后在PUT调用上获得200响应,但该对象永远不会出现在控制台中。

1 个答案:

答案 0 :(得分:1)

试试这个:

from google.appengine.api import images
import urllib2

image = urllib2.urlopen(image_url)

img_resp = image.read()
image.close()

objectName = '/myBucket/testObject.jpg'
options = {'x-goog-acl': 'public-read', 
         'Cache-Control': 'private, max-age=0, no-transform'}

with gcs.open(objectName,
              'w',
              content_type='image/jpeg', 
              options=options) as f:

    f.write(img_resp)
    f.close()

而且,为什么要限制他们只输入网址。为什么不允许他们上传本地图片:

if isinstance(image_or_url, basestring):    # should be url
    if not image_or_url.startswith('http'):
        image_or_url = ''.join([ 'http://', image_or_url])
    image = urllib2.urlopen(image_url)
    content_type =  image.headers['Content-Type']
    img_resp = image.read()
    image.close()
else:
    img_resp = image_or_url.read()
    content_type = image_or_url.content_type

如果您在开发服务器上运行,该文件将上载到您的本地数据存储区。请查看:

http://localhost:<your admin port number>/datastore?kind=__GsFileInfo__

http://localhost:<your admin port number>/datastore?kind=__BlobInfo__