如何解决 'Bad request error' 以创建带附件的新 Cloudant 文档。
How to solve 'Bad request error' for creating new Cloudant doc with attachement .
我正在使用 Cloudant NoSQLDB 开发 python 客户端示例。对于比较简单的文档创建,还可以。但是,尝试将 base64 编码的文件作为 doc 的附件上传时,我 运行 遇到了一个我自己无法解决的问题。
请帮我。
这是我的代码。
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)
结果Error如下:
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
(没有“_attachments”部分,它可以正常工作。)
补充信息。
在上面的代码中,行;
dataContent = dataContentb.decode()
是我解决 json 错误所需要的。这要感谢一篇文章,
虽然,我无法将 "ENCODING" 指定为本文中显示的 decode() 参数(因为导致 "not defined error"),我猜结果
据我所知,通过插入打印语句,dataContent 就可以了。
您是对的,但是有一个 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
}
}
}
我正在使用 Cloudant NoSQLDB 开发 python 客户端示例。对于比较简单的文档创建,还可以。但是,尝试将 base64 编码的文件作为 doc 的附件上传时,我 运行 遇到了一个我自己无法解决的问题。
请帮我。
这是我的代码。
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)
结果Error如下:
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
(没有“_attachments”部分,它可以正常工作。)
补充信息。
在上面的代码中,行;
dataContent = dataContentb.decode()
是我解决 json 错误所需要的。这要感谢一篇文章,
虽然,我无法将 "ENCODING" 指定为本文中显示的 decode() 参数(因为导致 "not defined error"),我猜结果 据我所知,通过插入打印语句,dataContent 就可以了。
您是对的,但是有一个 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
}
}
}