【问题标题】:Google Cloud Endpoints non WebApp iOS Client BlobstoreGoogle Cloud Endpoints 非 WebApp iOS 客户端 Blobstore
【发布时间】:2014-05-27 01:38:50
【问题描述】:

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

我没有使用 blobstore_handlers 进程的 web 应用程序。

以这种方式上传 Blob 的流程是什么?

我已经实现了创建上传 URL 端点:

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)

返回的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 定向到另一个端点方法来处理上传过程?

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

前:

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

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

我看到旧的文件进程已被弃用并替换为谷歌云存储进程。这是我应该前进的方向吗?

【问题讨论】:

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


    【解决方案1】:

    Blobstore 上传works in several steps:

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

    【讨论】:

    • 感谢您的回答。这个过程对我来说很有意义。但是没有带有路由的 webapp2 可以做到吗?我可以使用一个端点创建上传 URL,但另一个云端点方法可以充当上传 URL 吗?
    • 肯定不是上传网址——这些是谷歌生成的一次性网址。也许作为上传处理程序 url(回调 url),但我对此表示怀疑。
    • 上传 URL 很好,图片正在进入 Blobstore。它是我遇到问题的重定向 URL。重定向 URL 需要指向可以处理其余过程的端点方法。他们没有想到人们可能不会使用会话和网络应用程序吗?我当前的 API 上没有前端 webapp。它只是一种针对移动应用的服务。
    • 那有没有关于如何存储图片的建议?
    • 到目前为止,我发现允许上传文件的唯一方法是为服务和上传端点创建一个 webapp。我在 create_upload_url 创建的上传 URL 上传递 URL 参数,并确保此 web 应用程序使用安全:始终。传递的 URL 参数是用户对象和 access_token 的键。在 webapp 方法上,我实现了 User 模型并验证访问令牌与传入的用户匹配。我认为这是 hackey。我将进一步研究 GCS 文件上传过程。
    【解决方案2】:

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

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

    前:

    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()
    

    【讨论】:

      【解决方案3】:

      这是一篇关于在 iOS 客户端中使用 Blobstore 的好文章。该示例使用 Java,如果在 Python 中重新创建后端代码有困难,请发表评论。

      https://brunofuster.wordpress.com/2011/03/11/uploading-an-image-from-iphone-to-appengine-blobstore-using-vraptor/

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-08-11
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多