我正在使用REST api从appengine将文件写入Google存储空间。
我的代码如下所示:
url = 'http://storage.googleapis.com/' + bucketName + filePath
LOG.debug('Attempting to write file: ' + url)
'''
compute expiry time one year in the future
'''
expiresDate = datetime.utcnow() + timedelta(days=zconfig.CACHE_EXPDAY)
formatStr = '%a, %d %b %Y %H:%M:%S GMT'
start_cloud = time.time()
headers = {'Content-Type' : mime,
'Content-Length' : len(imageBytes),
'Cache-Control' : 'Expires=' + expiresDate.strftime(formatStr),
'x-goog-api-version' : '2',
'x-goog-acl' : 'public-read'}
resp, content = http.request(url, 'PUT', body=imageBytes, headers=headers)
根据google storage api docs,REST api采用“x-goog-acl”标头,可以更改对象上的ACl。
但是,在创建此对象后,ACL仍未设置为public-read。我可以从gsutil以及GS浏览器中看到它。
有人能告诉我我做错了吗?
编辑:jterrace指出我没有将标头传递给请求。我修好了。但它仍然没有在对象上设置公共读取ACL。
答案 0 :(得分:1)
看起来你实际上并没有将头字典传递给请求函数:
resp, content = http.request(url, 'PUT', body=imageBytes)
应该是:
resp, content = http.request(url, 'PUT', body=imageBytes, headers=headers)
答案 1 :(得分:0)
虽然我不确切知道为什么/如何,但我认为当您访问旧的和新的控制台时,您没有以项目所有者身份登录。如果您没有获取/设置对象ACL的权限,旧控制台将不会显示“共享公共”选项(并且不允许您切换它)。新控制台在它实际告诉你的意义上更好。
您能否仔细检查您登录的用户是否为项目所有者?