【问题标题】:using appengine blobs for binary data in an obj-c app在 obj-c 应用程序中使用 appengine blob 处理二进制数据
【发布时间】:2010-11-25 09:08:12
【问题描述】:

我正在编写一个 obj-c 应用程序,并希望将一个几兆大小的二进制文件上传到我的 appengine 服务器 (python)。我猜我需要为此使用 blob 实体,但不确定如何去做。到目前为止,我一直在使用 http 请求和响应来发送和接收数据,但它们已被编码为字符串。有人可以建议我如何对来自 obj-c 应用程序的 blob 做同样的事情吗?我看到一些涉及 http 请求的示例,但它们似乎是针对网页的,我对此并不十分熟悉。有没有像样的教程或演练?

我基本上不完全确定,如果我应该将其编码为 http 请求并通过响应将其发送回,如何将二进制数据从客户端获取到 http 字符串中以及如何将其发送回下载我的二进制数据时从服务器正确。我在想,这种方法可能与我习惯用 param1=val&param2=val2 样式格式将值编码到我的请求中的方法完全不同,但不确定。

我应该为此使用 blobstore 服务吗?一个重要的注意事项是,我听说 blob 有 1 兆的限制,但我需要存储 2-3 兆的音频文件(至少 1.8 兆)。

【问题讨论】:

    标签: objective-c http binary blob


    【解决方案1】:

    我最近不得不做一些类似的事情,尽管它是通过套接字连接的二进制数据。到客户端使用XML,到服务器作为数据流。在来回发送二进制数据时,我最终对二进制数据进行了 base64 编码。这有点罗嗦,但特别是在客户端,它使事情更容易处理,在我的 XML 中无需担心特殊字符。然后我用 NSData 将它翻译成真正的二进制格式。我使用this code进行编码和解码,搜索“cyrus”找到我使用的sn-p,这里有一些可以工作。

    在您的情况下,我会将您的 http 请求更改为发布数据调用,而不是将其全部放在 URL 中。如果您不确定有什么区别,请查看here

    我对 python 不太熟悉,但您可以尝试here 寻求帮助。

    希望对您有所帮助。

    编辑 - 看起来 blob 是要走的路。查看this link 了解字符串/blob 类型以及this link 了解有关使用blob 的更多信息。

    【讨论】:

    • 我还假设您有能力使用 appengine 服务器对它进行编码/解码,但我从未使用过它,所以我想如果不是这种情况,这可能是不可能的。如果不能,则将其存储为 blob 比将其编码并将其存储为文本更好。
    • 感谢您的领导。我会检查一下。由于其他对象类型的大小限制,我很确定我必须使用 blob(仍未确认)。我将更新我的原始帖子以提及这一点。
    • 只花了几分钟,看了一些appengine API。我会用一些链接更新我的答案,但听起来你应该已经拥有谷歌可用的工具,并且应该使用 blob。此外,看起来 blob 的大小限制为 1 MB。
    • 我注意到 blobstore 文档说“允许应用程序提供最大为 2 GB 大小的数据对象”,这让我感到困惑,这与 blob 的 1 meg 限制有何关系。我有较大的音频文件要存储,大小为几兆,至少不到 2。这是否意味着我必须将它们分解或使用不同的方法? (将更新主要问题)
    • 如果您的 blob 大于限制(如果是 1 或 2 MB,不知道那里),那么您需要将它们分成单独的部分。使用 NSData 应该不难做到这一点。希望你能明白这一点。
    【解决方案2】:

    这里三问合一:

    1. 是否应该将 BLOB 用于二进制数据?
    2. 如何发布二进制数据,并从应用引擎使用它
    3. 如何从应用引擎检索二进制数据

    如果您“应该”使用 blob,我无法回答,只有您知道答案,这在很大程度上取决于您尝试存储的数据类型以及如何使用它。让我们以一张图片为例(这可能是最流行的用例)。您希望用户用手机拍照、上传照片,然后与其他用户分享。这是对 blob 的很好使用,但正如 @slycrel 所建议的那样,您会遇到记录大小的限制。这是可行的,例如您可以使用python图像库(pil)来缩小图像。

    要发布二进制数据,请参阅this question。最好缓存 2 个副本,一个缩略图和一个完整尺寸。这样,调整大小只需在上传时发生一次。如果您想做得更好,可以使用应用引擎的新后台作业功能来排队处理图像以供以后使用。无论哪种方式,您都需要返回新创建的 blob 的 ID,这样您就可以从设备中引用它,而无需额外的 http 请求。

    要检索数据,我认为最好的方法是将 BLOB 视为它自己的资源。调整您的路线,使任何给定的 blob 都具有唯一的 URL:

    http://myweb/images/(thumbnail|fullsize)/<blobid>.(jpg|png|gif)
    

    其中 BLOBID 是动态的,而 JPG、PNG 或 GIF 可用于获取特定类型的图像。缩略图或全尺寸可用于检索您在发布时保存的较小或较大版本。

    【讨论】:

      猜你喜欢
      • 2017-10-23
      • 1970-01-01
      • 2023-03-17
      • 2010-10-01
      • 1970-01-01
      • 2014-12-28
      • 2018-02-05
      • 1970-01-01
      • 2011-03-04
      相关资源
      最近更新 更多