将文件从iOS应用程序发送到在谷歌应用引擎

时间:2016-01-20 09:00:05

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

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

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

我配置了一个存储桶,它具有class = Durable Reduced Availability。

有人能指出我做错了吗(我怀疑这是关于我如何在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存储的状态[201]。但得到状态403。   路径:'/ var / mobile / Containers / Data / Application / 4thFB6C1D7-9504-4215-BC25-FC490298EEF6 / Library / Cache / Logs / app.apm.smartiothome.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访问被拒绝.Caller没有storage.objects.create访问存储桶变量。”。   额外信息:无。

1 个答案:

答案 0 :(得分:0)

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

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