2014-09-26 131 views
1

我目前正在移植一個我已經與Google App Engine合作的web服務。 Web服務的主要功能之一是上傳圖像(例如,個人資料圖片)。目前我所做的是:谷歌雲存儲 - 知道誰上傳

  • 使用他獨特的API KEY和其他數據驗證想要上傳圖像的用戶。
  • 上傳文件,給它一個唯一的名稱,並將文件的名稱存儲在mysql數據庫的用戶行中。
以港口

現在的文件上傳到App Engine我使用谷歌雲存儲和下面這個教程: https://cloud.google.com/appengine/docs/php/googlestorage/user_upload

我試圖讓文件上傳與我的Android應用工作採用以下方式:

  • 用戶發出請求,webservice對其進行身份驗證併發送響應由CloudStorageTools::createUploadUrl創建的上載url。
  • 用戶上傳圖像到這個網址
  • 現在繼承人的問題:上傳完成後,POST是在createUploadUrl給定的PHP文件(我從谷歌的文檔行情)與上傳的文件進行。但是,這個腳本怎麼知道誰上傳了它的文件呢?我無法傳遞任何參數,指示誰將文件上載到createUploadUrl,因此我無法將文件名插入到Cloud SQL數據庫中的用戶,因此現在只有一個文件與Cloud Storage中的任何內容沒有關聯。

任何提示?我錯過了什麼嗎?

+0

雖然不理想,但您可以通過POST請求將API密鑰作爲附加字段提交。這些字段將被轉發到'createUploadUrl'指定的URL。 – Mars 2014-09-29 01:38:50

回答

2

我張貼此作爲一個單獨的答案,因爲一)它比不同的方法第一個答案,和b)我主張我的這個我的其他答案,因爲我認爲最好讓GAE處理身份驗證。然而,我認爲你可以做你想要做的事情:

而不是路由一個單一的URL到你的上傳處理程序,在你的app.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來獲取查詢字符串,然後解析查詢字符串,在URL中傳遞的值填充API_KEY的價值你本地範圍。

我剛剛使用dev_appserver測試了這種從php腳本中的請求URL中提取東西的模式,它工作正常。

+0

謝謝!這正是我一直在尋找的 – Eran 2014-09-30 11:34:13

0

我想你可以在你的php腳本中使用google appengine users service來做到這一點。

從上面的鏈接,從用戶服務的概述頁面,這裏是你如何獲得當前用戶:

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

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

問題是,這是一個移動設備的web服務,所以我不能真正看到誰登錄,因爲他們不是(UserService應該顯示登錄屏幕,但他們可以沒有看到它)。此外,並非所有用戶都擁有Google帳戶。 – Eran 2014-09-27 06:59:52

+0

@Eran在上傳url的第一步中引用的認證是什麼? – Tjorriemorrie 2014-09-28 16:56:49

+0

每個用戶都有一個唯一的API密鑰,在他註冊/登錄時分配給他。他發送的每個請求都有API密鑰,以驗證請求是否有效並知道它的來源。 – Eran 2014-09-28 17:25:48