2017-09-27 37 views
1

我正在使用Cloudant NoSQLDB處理python客戶端示例。對於相對簡單的文件創建來說,沒關係。然而,試圖上傳一個base64編碼文件作爲doc的附件,我遇到了一個我自己無法解決的問題。
請幫幫我。如何解決用於創建具有附件的新Cloudant文檔的「錯誤請求錯誤」。

這是我的代碼。

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) 

結果錯誤如下:

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 

(沒有 「_attachements」 部分,它工作適當。)

的附加信息。

在上面的代碼中,行;

dataContent = dataContentb.decode() 

是我需要解決json錯誤。這要歸功於一篇文章,Serialize in JSON a base64 encoded data

雖然,我不能指定「編碼」作爲解碼()的參數,如本文中顯示(因爲造成「沒有定義的錯誤」),我猜結果 dataContent會OK,只要我可以通過插入打印聲明來看到。

回答

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 
    } 
    } 
} 
相關問題