使用REST API中的标头设置对象ACL不起作用

时间:2013-05-20 19:14:14

标签: google-app-engine google-cloud-storage

我正在使用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。

2 个答案:

答案 0 :(得分:1)

看起来你实际上并没有将头字典传递给请求函数:

resp, content = http.request(url, 'PUT', body=imageBytes)

应该是:

resp, content = http.request(url, 'PUT', body=imageBytes, headers=headers)

答案 1 :(得分:0)

虽然我不确切知道为什么/如何,但我认为当您访问旧的和新的控制台时,您没有以项目所有者身份登录。如果您没有获取/设置对象ACL的权限,旧控制台将不会显示“共享公共”选项(并且不允许您切换它)。新控制台在它实际告诉你的意义上更好。

您能否仔细检查您登录的用户是否为项目所有者?