0

私の iOS アプリは、Google アプリ エンジン バックエンドとやり取りします。ユーザーが問題を報告するオプションがあります。ユーザーが問題を説明するテキストを入力して [送信] ボタンを押すと、問題の説明と、CocoaLumberjack を使用してアプリで収集されているログのバックグラウンド アップロードを開始したいと考えています。

私の現在のアプローチ(ほとんど機能しています)は次のとおりです。iOS はmultipart/form-data POST リクエストを送信します。このリクエストには、バグの説明とログ ファイルの内容 ( NSData) を含む文字列が含まれており、各部分は境界で区切られています。GAE サーバーは各部分を正常にデコードすることができ、 を使用して印刷するとファイルの内容を確認できますlogging.info()。ただし、ファイルを GCS に保存しようとすると、エラーが発生します。GCS への保存に使用されるコードとエラーは以下のとおりです。

1 つのストレージ バケットが構成されており、これにはクラス = 耐久性が低下した可用性があります。

誰かが私が間違っていることを教えてもらえますか (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 になりました。 -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_tk9wTPoa4kB1Aici7XP7Z6fNtuSJlGDokUmxtCFAl8}. 本文: 「AccessDeniedアクセスが拒否されました。呼び出し元には storage.objects がありません。

4

1 に答える 1

0

「IAM & Admin」>「サービス アカウント」メニューを開き、「App Engine デフォルト サービス アカウント」行から「サービス アカウント ID」をコピーしました。名前は私のアプリで、その後に「@appspot.gserviceaccount.com」が続きます。

次に、ストレージを開き、デフォルト バケットの横にある [...] > [バケットの権限を編集] をクリックします。ライター アクセス権を持つユーザーとしてサービス アカウントを追加しました。

于 2016-06-04T23:05:19.517 に答える