2014-09-26 115 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