2014-09-26 2 views
1

В настоящее время я переношу веб-сервис, который я создал для работы с Google App Engine. Одной из основных функций веб-службы является загрузка изображения (например, изображение профиля). В настоящее время я занимаюсь:Google Cloud Storage - Знать, кто загрузил

  • Аутентифицировать пользователя, который хочет загрузить изображение, используя уникальный API-ключ KEY и другие данные.
  • Загрузите файл, укажите ему уникальное имя и сохраните имя файла внутри строки пользователя в базе данных mysql.

Теперь для того, чтобы порт файл для загрузки в App Engine Я использую Google Cloud Storage и после этого урока: https://cloud.google.com/appengine/docs/php/googlestorage/user_upload

Я пытаюсь получить загрузку файлов для работы с моим Android приложение следующим образом:

  • пользователь делает запрос, вебсервис проверяет подлинность его и посылает в ответ на URL загрузки созданного CloudStorageTools::createUploadUrl.
  • пользователь загружает файл в этот URL
  • Теперь Heres проблема: После загрузки будет сделано, POST производится в указанный файл PHP в createUploadUrl (цитирую документы Google) с загруженного файла. Но как этот скрипт знает, кто загрузил файл, который он получил? Я не могу передать какие-либо параметры, указывающие, кто загрузил файл в createUploadUrl, поэтому я не могу вставить имя файла пользователю в облачную SQL-базу данных, поэтому теперь это только файл, не связанный ни с чем в Cloud Storage.

Любые подсказки? Я что-то упускаю?

+0

Хотя это не идеальный вариант, вы можете отправить ключ API в качестве дополнительных полей с запросом POST. Эти поля будут перенаправлены на URL-адрес, указанный в 'createUploadUrl' – Mars

ответ

2

Я отправляю это как отдельный ответ, потому что а) это другой подход, чем первый ответ, и b) Я бы отстаивал свой ответ на этот вопрос, потому что я думаю, что лучше всего позволить GAE обрабатывать auth. Тем не менее, я думаю, вы можете сделать то, что вы пытаетесь сделать следующим образом:

Вместо маршрутизации уникального URL-адреса для вашего обработчика загрузки используйте регулярное выражение, подобное этому в вашем приложении.yaml, чтобы направить любые сопоставленные URL-адреса на ваш обработчик:

handlers: 
- url: upload_handler/(.*) 
    script: my-php-script-that-uploads-stuff.php 

Тогда при вызове createUploadURL, просто передать в вашем api_key после 'upload_handler/' в качестве аргумента запроса, например,

$upload_url = CloudStorageTools::createUploadUrl(sprintf('/upload_handler/?API_KEY=%s', $API_KEY), $options); 

Тогда в my-php-script-that-uploads-stuff.php:

parse_str(parse_url($_SERVER['REQUEST_URI'])['query']) 

Это будет анализировать запрос URL, чтобы получить строку запроса, а затем разобрать строку запроса, заселение значение api_key с значением, переданным в URL в вашем локальный охват.

Я только что протестировал этот шаблон извлечения материала из URL-адреса запроса в php-скрипте с помощью dev_appserver, и он сработал.

+0

Спасибо! Это именно то, что я искал – Eran

0

Я думаю, вы можете сделать это, используя google appengine users service в своем php-скрипте.

Из приведенной выше ссылке, с обзорной странице сервиса пользователей, вот как получить текущий пользователь:

use google\appengine\api\users\User; 
use google\appengine\api\users\UserService; 

$user = UserService::getCurrentUser(); 
+0

Проблема заключается в том, что это веб-сервис для мобильных устройств, поэтому я не могу видеть, кто вступил в систему, поскольку они не являются (UserService должен отображать экран входа в систему, но они могут видеть это). Кроме того, не все мои пользователи имеют учетные записи google. – Eran

+0

@Eran, на что вы ссылаетесь на первом этапе для URL-адреса для загрузки? – Tjorriemorrie

+0

Каждый пользователь имеет уникальный ключ API, который присваивается ему при регистрации/входе в систему. Каждый запрос, который он отправляет, имеет в нем ключ API, чтобы проверить, действительно ли запрос, и знать его происхождение. – Eran

Смежные вопросы