我有一个在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响应,但该对象永远不会出现在控制台中。
答案 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__