【问题标题】:Upload a recording to Google App Engine from Android app从 Android 应用程序将录音上传到 Google App Engine
【发布时间】:2015-02-01 12:55:15
【问题描述】:

我创建了一个 android 应用程序,它可以进行基本的录音(存储为 .mp4)。我想添加一项功能,可以将记录(一次只发送一个,不需要批量)发送到 Google App Engine 云存储。然后,我希望能够在我的(非常基本的)云应用程序上收听这些录音。我不想使用blobstore,而是使用数据存储。我以前使用过数据存储区,但总是只使用云应用程序和 python,从不使用 android 应用程序(而且我的 java 充其量是不稳定的)。以前,我只是从我的 apppot 网站表单中获取其他数据,然后使用 html 和 python 将其发送到数据存储区。

简而言之,我的问题是,如何将我的录音从我的 android 应用程序获取到数据存储区。代码 sn-ps 和/或文档链接将非常有帮助。此外,对这些事物如何交流/协同工作的简短解释也有助于我的大脑将这些点联系起来。

请注意,这是一个个人应用程序,仅供我自己学习和使用,因此我不太关心安全性、用户帐户、可扩展性等。

感谢您的帮助!

【问题讨论】:

    标签: java android python google-app-engine python-2.7


    【解决方案1】:

    对于此用例,Datastore 不是一个好的存储选项,因为最大实体大小限制为 1mb。 GCS 是此用例的推荐选项。此外,如果您对 Java 不是很熟悉,您可以使用 Python 作为您的 GAE 后端。

    关于如何将记录从 Android 移动到 GAE GCS / Datastore 的问题,您可以使用以下选项之一:

    1. 通过 Google API 客户端库使用 GCS JSON API 直接从 Android 应用上传。这是一个简单的选择,并且有大量可用的样本。如果你坚持使用,这个库也可以用于Datastore
    2. 使用Cloud Endpoints 作为代理。您可以将文件提交给端点处理程序,端点处理程序将文件保存在 GCS 中并返回响应。由于您不关心安全性,这里有一个不使用 OAuth 的示例:
    import cloudstorage as gcs
    import endpoints
    import os
    
    from google.appengine.api import app_identity
    from protorpc import messages
    from protorpc import message_types
    from protorpc import remote
    
    class Base64File(messages.Message):
        file = messages.BytesField(1, required=True, variant=messages.Variant.BYTES)
    
    class ResponseMSG(messages.Message):
        message = messages.StringField(1)
    
    FILE_RESOURCE = endpoints.ResourceContainer(Base64File,
                                                file_name=messages.StringField(2,required=True),
                                                content_type=messages.StringField(3,required=True))
    
    @endpoints.api(name='gcsuploadapi', version='v0.1',
                                          description='Upload a file to GCS.')
    class GCSUploadAPI(remote.Service):
        @endpoints.method(FILE_RESOURCE, ResponseMSG,
                            path='upload/{file_name}', http_method='POST',
                            name='upload.file')
        def upload_file(self, request):
            # get app default bucket and prepare filename (project should have billing enabled)
            bucket_name = os.environ.get('BUCKET_NAME',
                                     app_identity.get_default_gcs_bucket_name())
            bucket = '/' + bucket_name
            filename = bucket + '/' + request.file_name
    
            # create file (request.content_type contains MIME type submitted)
            write_retry_params = gcs.RetryParams(backoff_factor=1.1)
            gcs_file = gcs.open(filename, 'w',
                                content_type=request.content_type,
                                retry_params=write_retry_params)
            gcs_file.write(request.file)
            gcs_file.close()
    
            return ResponseMSG(message="done")
    
    app = endpoints.api_server([GCSUploadAPI])
    

    您不必生成客户端库,可以直接通过 HTTP POST 提交。端点仅支持 HTTPS 连接,并且请求受到与其他 GAE requests 相同的限制。主要关注的是 32 兆字节的请求大小。考虑到提交到端点的二进制数据应该是 base64 编码的,它给你留下了大约 23-24mb 的二进制数据限制。另一个限制是 60 秒的请求截止日期,如果您为 GAE 应用程序使用 modular approach 并为端点使用后端实例,则可以解决此问题。

    这可能是最难实现的选项,但我提供的示例应该是一个好的开始。

    1. 使用 Cloud Endpoints 生成 Blobstore API 上传 URL。 Blobstore API 允许 uploading to GCS 代替 Blobstore。这也是一个相当简单的选择。

    【讨论】:

      猜你喜欢
      • 2019-05-16
      • 1970-01-01
      • 2011-03-08
      • 2014-03-11
      • 2014-05-08
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多