0

我的 iOS 应用与谷歌应用引擎后端交互。我可以选择让用户报告问题。当用户输入描述问题的文本并按下提交按钮时,我想开始后台上传问题描述以及使用 CocoaLumberjack 在应用程序中收集的日志。

我目前的方法(几乎有效)如下。iOS 发送一个multipart/form-data POST 请求,其中包含一个带有错误描述和日志文件内容 ( NSData) 的字符串,每个部分由边界分隔。GAE 服务器能够成功解码每个部分,当我使用logging.info(). 但是,当我尝试将文件存储到 GCS 时,出现错误。用于存储到 GCS 和错误的代码如下。

我配置了一个存储桶,它的类 = 持久性降低的可用性。

有人可以指出我做错了什么(我怀疑这是关于我如何在 GCS 容器中设置授权列表的问题)?

或者,如果有人有更简单的方法来解决这个问题,我会全力以赴。

用于存储到 GCS 的代码是:

logging.info('Creating file %s\n' % (filename))            
write_retry_params = gcs.RetryParams(initial_delay=0.2,
                              max_delay=5.0,
                              backoff_factor=1.2,
                              max_retry_period=15)

gcs_file = gcs.open(filename,
                'w',
                content_type='text/plain',
                retry_params=write_retry_params)
gcs_file.write(filename=getattr(request, 'fileAttached'))
gcs_file.close()

在 GAE 中看到的错误:

ForbiddenError:期望来自 Google Storage 的状态 [201]。但得到状态 403。路径:'/var/mobile/Containers/Data/Application/4FB6C1D7-9504-4215-BC25-FC490298EEF6/Library/Caches/Logs/com.apm.smartiohome.chatime%202016-01-20%2008 -01.log'。请求头:{'x-goog-resumable': 'start', 'x-goog-api-version': '2', 'content-type': 'text/plain', 'accept-encoding': 'gzip , *'}。响应头:{'content-type': 'application/xml; charset=UTF-8','content-length':'195','vary':'Origin','x-guploader-uploadid':'AEnB2Uo1b-z2VGlHOnurusG2F9bgKcBVwmYWZrQFG4d4NBrHA_tk9wTPoa4kB1Aici7XP7Z6fNtuSJlGDokUmxtCFAl8aMnXGA' 正文:“AccessDenied访问被拒绝。调用者没有 storage.objects。

4

1 回答 1

0

我打开菜单“IAM & Admin”> 服务帐户并从“App Engine 默认服务帐户”行复制“服务帐户 ID”。名称是我的应用程序,后跟“@appspot.gserviceaccount.com”。

接下来,我打开存储并单击默认存储桶旁边的“...”> 编辑存储桶权限。我将服务帐户添加为具有 Writer 访问权限的用户。

于 2016-06-04T23:05:19.517 回答