2017-09-27 1 views
1

Je travaille sur des exemples de clients python avec Cloudant NoSQLDB. Pour la création de document relativement simple, c'est OK. Cependant, en essayant de télécharger un fichier encodé en base64 en pièce jointe à doc, je rencontre un problème que je ne peux pas résoudre par moi-même.
S'il vous plaît aidez-moi.Comment résoudre 'Mauvaise demande d'erreur' pour créer un nouveau document Cloud avec pièce jointe.

Voici mon code.

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) 

L'erreur de résultat est la suivante:

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 

(sans section "_attachements", il fonctionne correctement.)

Informations complémentaires.

Dans le code ci-dessus, la ligne;

dataContent = dataContentb.decode() 

est celui dont j'avais besoin pour résoudre l'erreur json. Ceci est grâce à un article, Serialize in JSON a base64 encoded data

Bien que, je ne pouvais pas spécifier « encoding » comme paramètre decode() comme le montre cet article (car causant « erreur non défini »), je suppose que la résultante dataContent serait OK pour autant que je peux voir en insérant une instruction d'impression ..

Répondre

0

Vous êtes sur la bonne voie, mais il existe une méthode put_attachment dédiée au téléchargement de pièces jointes à un document existant.

est ici un code de travail

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() 

Cela crée une base de données, ajoute un document et puis télécharge une image en pièce jointe. Une fois le script terminé, le document ressemble à ceci:

{ 
    "_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 
    } 
    } 
}