0

Приложение MyOS взаимодействует с бэкэдом механизма приложения Google. У меня есть возможность для пользователя сообщить о проблеме. Когда пользователь вводит текст, описывающий проблему, и нажимает кнопку «Отправить», я хочу запустить фоновое скачивание описания проблемы и журналы, собираемые в приложении, используя CocoaLumberjack.Отправка файлов из приложения iOS на сервер, запущенный в движке Google.

Мой текущий подход (почти работает) заключается в следующем. iOS отправляет запрос POST multipart/form-data, который содержит строку с описанием ошибки и содержимым файла журнала (NSData) с каждой частью, разделенной границей. Сервер GAE может успешно декодировать каждую часть, и я могу видеть содержимое файла, когда я его распечатываю, используя logging.info(). Однако, когда я пытаюсь сохранить файл в GCS, я получаю сообщение об ошибке. Код, используемый для хранения GCS и ошибки, приведен ниже.

У меня есть один накопительный ковш, который имеет класс = Durable Reduced Availability.

Может кто-нибудь указать мне на то, что я делаю неправильно (я подозреваю, что это что-то вроде того, как я настраивал списки авторизации в контейнере 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: Expect status [201] from Google Storage. But got status 403. Path: '/var/mobile/Containers/Data/Application/4FB6C1D7-9504-4215-BC25-FC490298EEF6/Library/Caches/Logs/com.apm.smartiothome.chatime%202016-01-20%2008-01.log'. Request headers: {'x-goog-resumable': 'start', 'x-goog-api-version': '2', 'content-type': 'text/plain', 'accept-encoding': 'gzip, *'}. Response headers: {'content-type': 'application/xml; charset=UTF-8', 'content-length': '195', 'vary': 'Origin', 'x-guploader-uploadid': 'AEnB2Uo1b-z2VGlHOnurusG2F9bgKcBVwmYWZrQFG4d4NBrHA_tk9wTPoa4kB1Aici7XP7Z6fNtuSJlGDokUmxtCFAl8aMnXGA'}. Body: " AccessDenied Access denied.Caller does not have storage.objects.create access to bucket var.". Extra info: None.

ответ

0

Я открыл меню "IAM & Администратор"> Обслуживание счетов и скопировал «Service ID учетной записи «из строки« Учетная запись службы по умолчанию для App Engine ». Название было моим приложением, а затем «@ appspot.gserviceaccount.com».

Далее я открыл хранилище и щелкнул «...» рядом с ведром по умолчанию> Изменить разрешения ведра. Я добавил учетную запись службы как пользователь с доступом Writer.