python-couchdbkit:如何解压缩/解码通过Database.get接收到的二进制附件(..attachme



我遇到了以下问题:

我想从我的CouchDB数据库中请求一个文档及其所有附件,而无需多次调用。我打以下电话给

value = mydb.get(docid = key, attachments = True, latest = True)

这个电话是基于我在http://docs.couchdb.org/en/latest/api/document/common.html和http://couchdbkit.org/docs/api/couchdbkit.client.Database-class.html#get

通话后,我在下找到

value["_attachments"]["some_attachment_name"]["data"]

内容如下:

woACfXEBKFUFdGh1bWJVQWh0dHA6Ly9zdGF0aWMyLmJpZ3N0b2NrcG...

这本应该是一本经过修改的字典(cpickle,protocol=2),但它显然不是,否则那里会有可读的东西(我无法解开它)。我假设它被压缩和/或转换为base64。

当使用fetch_attachment时,我可以毫无问题地取消拾取,所以看起来fetch_attachment会自动解压缩/解码,而get(...attachments = True...)不会。

以下是我在default.ini中的CouchDB压缩配置:

file_compression = snappy
compression_level = 9

这里是value["_attachments"]["some_attachment_name"]的内容:

{
   #I use octet-stream for binary data
   "content_type" : "application/octet-stream",
   "data" : "woACfXEBKFUFdGh1bWJVQWh0dHA6Ly9zdGF0aWMy...
   "digest" : "md5-wItlEd2ZXkU3HF2TA9yiOg==",
   "revpos" : 2
}

因此,实际的问题是:如何解压缩/解码数据,最干净的方法是什么

在有人开始问我为什么使用cPickle而不是直接将字典写入CouchDB之前,让我提前说,我有自己的理由,我不打算离开cPickle。我还打算保留*.ini文件中的压缩选项。

好吧,我问的时候几乎回答了我自己的问题:D当我进一步阅读文档时,我偶然发现了这一点:

数据(字符串):Base64编码内容

因此base64代码,而不是压缩的。我所要做的就是

import base64
...
value = mydb.get(docid = key, attachments = True, latest = True)
decoded_data = base64.b64decode(value["_attachments"]["some_attachment_name"]["data"])

我希望这对某人有帮助。

此外,当我思考我的问题时,如果CouchDB在发送响应之前没有自动解压缩压缩数据,那会有点奇怪。

相关内容

  • 没有找到相关文章

最新更新