Google Cloud Endpoints非WebApp iOS客户端Blobstore

时间:2014-04-12 23:21:36

标签: ios google-app-engine google-cloud-endpoints blobstore

我正在尝试为用Python编码的GCE应用程序创建blobstore上载过程。

我没有使用blobstore_handlers进程的webapp。

以这种方式上传blob的过程是什么?

我已实现了创建上传网址端点:

from google.appengine.ext import blobstore


def blobstore_get_upload_url(self, request):

    upload_url = blobstore.create_upload_url('/upload')
    return self.construct_valid_response(StatusResponse, upload_url)

返回的网址不是APP上的有效路由:

http://127.0.0.1:8080/_ah/upload/ag1kZXZc3RyaW5nLWltciILEhVfX0Jsb2JVcGxvYWRTZXNzaW9uX18YgICAgICAgAsM

当我尝试POST到此URL时,我收到此错误:

The url "/api" does not match any handlers.

我的app.yaml:

handlers:
# Endpoints handler
- url: /_ah/spi/.*
    script: app_api.APPLICATION

我的问题:

我是否需要在我的端点应用程序之外创建一个单独的脚本来将blob上传到?或者有没有办法将上传URL指向另一个端点方法来处理上传过程?

当我尝试在应用上指定另一个端点作为上传网址时,它会被忽略。

EX:

upload_url = blobstore.create_upload_url('/api#p/Api/v1/api.app.blobstore_upload')

注意我已从上述网址中删除了应用名称并将其替换为API,但我使用的网址是应用中的有效网址。

我看到旧文件进程已弃用,并替换为google云存储过程。这是我应该走的方向吗?

2 个答案:

答案 0 :(得分:0)

Blobstore上传works in several steps

  1. 通过create_upload_url(callbackUrl)创建一次性上传网址。发送给客户。
  2. 客户必须然后使用multipart/form-data POST请求将数据上传到该网址。
  3. Google会提取内容,将其存储到blobstore中,然后调用callbackUrl。您需要在该Url上定义一个处理程序。处理程序接收Google为上传的内容创建的blobstore密钥。

答案 1 :(得分:0)

我通过使用gcs API函数解决了这个问题:

https://cloud.google.com/appengine/docs/python/googlecloudstorageclient/functions

EX:

default_retry_params = gcs.RetryParams(initial_delay=0.2,
                                   max_delay=5.0,
                                   backoff_factor=2,
                                   max_retry_period=15)

gcs.set_default_retry_params(default_retry_params)

bucket_name = os.environ.get('BUCKET_NAME',
                         app_identity.get_default_gcs_bucket_name())

gcs_file = gcs.open('/' + bucket_name + '/' + str(c.key.id()) + '/' + request.image_key,
                    'w',
                    options={'x-goog-meta-creator': str(u.key.id()),
                             'x-goog-meta-image-key': request.image_key,
                             'x-goog-meta-container': str(c.key.id())})

gcs_file.write(base64.b64decode(request.encoded_image))
gcs_file.close()