如何使用附件创建新的Cloudant doc来解决“错误请求错误”。

时间:2017-09-27 08:27:13

标签: python json cloudant

我正在使用Cloudant NoSQLDB处理python客户端示例。对于相对简单的文档创建,没关系。但是,尝试上传base64编码文件作为doc的附件,我遇到了一个我自己无法解决的问题。
请帮我。

这是我的代码。

"String from service"

结果错误如下:

from cloudant.client import Cloudant
from cloudant.error import CloudantException
from cloudant.result import Result,ResultByKey
import base64
.
.
.

client.connect()
databaseName = "mydata1"
myDatabase = client[databaseName]

targetfile = "chibitest.png"
with open(targetfile,"rb") as fp:
    byte_content = fp.read()
dataContentb= base64.b64encode(byte_content)
dataContent = dataContentb.decode()

jsonDoc = {
    "nameField": "sample1",
    "_attachements":{
      targetfile: 
      {"content-type":"image/png",
       "data":dataContent}
     }
}
newDocument = myDatabase.create_document(jsonDoc)

(没有“_attachements”部分,它可以正常工作。)

其他信息。

在上面的代码中,行;

raise HTTPError(http_error_msg, response=self)
requests.exceptions.HTTPError: 400 Client Error: Bad Request doc_validation Bad
special document member: _attachements for url:https://.....cloudant.com/mydata1 

是解决json错误所需要的。这要归功于一篇文章Serialize in JSON a base64 encoded data

虽然,我无法将“ENCODING”指定为本文所示的decode()参数(因为导致“未定义的错误”),我猜测结果  通过插入print语句,我可以看到dataContent。

1 个答案:

答案 0 :(得分:0)

您的排名正确,但有一个put_attachment方法专门用于将附件上传到现有文档。

这是一些工作代码

from cloudant.client import Cloudant
import base64

# connect
client = Cloudant('USER', 'PASS', account='ACCOUNT', connect=True)
session = client.session()

# create database
my_database = client.create_database('so46442945')

# load attachment
targetfile = "dog.png"
with open(targetfile,"rb") as fp:
    byte_content = fp.read()
dataContentb= base64.b64encode(byte_content)
dataContent = dataContentb.decode()

# Create a document using the Database API
jsonDoc = {
  '_id': 'mydoc', 
  'name': 'Julia',
  'age': 30,
  'pets': ['cat', 'dog', 'frog']
}
my_document = my_database.create_document(jsonDoc)

# Add attachment
my_document.put_attachment('dog.png', 'image/png', dataContent)

# disconnect
client.disconnect()

这将创建一个数据库,添加一个文档,然后上传一个图像附件。脚本完成后,文档如下所示:

{
  "_id": "mydoc",
  "_rev": "2-0649fa69ed362501f97a328e4e81ee21",
  "age": 30,
  "name": "Julia",
  "pets": [
    "cat",
    "dog",
    "frog"
  ],
  "_attachments": {
    "dog.png": {
      "content_type": "image/png",
      "revpos": 2,
      "digest": "md5-l5CNi8JJBiQjUd+cS1ZFng==",
      "length": 436572,
      "stub": true
    }
  }
}