2011-10-20 4 views
8

PROBLÈMECouchDB Sur la volée des pièces jointes par la ligne de commande

Je veux être en mesure de joindre un/attachement multiple (s) que le document est créé, via la ligne de commande (voir ci-dessous) . Je peux seulement obtenir ceci pour fonctionner dans Futon (Couchbase), mais seulement après qu'un document ait été déjà créé.

J'ai essayé les suivantes:

curl -X PUT 'http://username:[email protected]:5984/client_info' 

curl -X POST 'http://username:[email protected]:5984/client_info' -H 'Content-Type: application/json' -d '{"client_type": "Private", "client_name": "John Doe","client_email": "[email protected]","client_city": "Toronto","created_at": "2011-09-06 12:45:03","expires_at": "2012-01-01 00:00:00", "_attachments": { 
    "test01.jpg": { 
     "content_type": "image/jpeg", 
     "length": 30189   
    } 
    } 
}' 

Cela ne entraîne l'erreur suivante:

{"error":"unknown_error","reason":"function_clause"} 

Merci

Répondre

16

Vous devez télécharger votre pièce jointe dans une étape séparée, contenant le réel fichier joint dans le corps de la requête. Commencez par créer votre document habituel, puis envoyez une autre requête pour télécharger le fichier. Voici un exemple sur la façon de télécharger une pièce jointe à l'aide de Flexion (http://guide.couchdb.org/draft/api.html#attachments): curl -v -X PUT http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af/artwork.jpg?rev=2-2739352689 --data-binary @artwork.jpg -H "Content-Type: image/jpg"

Et voici l'API officielle pour les pièces jointes: http://wiki.apache.org/couchdb/HTTP_Document_API#Standalone_Attachments

+0

Donc, je dois d'abord créer le document, obtenir un _rev et ensuite utiliser PUT pour attacher une image? Pourquoi n'est-il pas possible de faire cela simultanément? Et si les informations que je veux saisir proviennent d'un formulaire d'inscription, où l'utilisateur a la possibilité de télécharger une ou plusieurs images? Comment ferais-je cela? – EdvardG

+0

Si vous recherchez un stockage hautement évolutif pour les objets binaires qui écrivent simultanément dans un seau, CouchDB n'est peut-être pas votre premier choix. Il existe encore plusieurs solutions de contournement pour votre problème: Stocker les copies locales des images téléchargées localement et les mettre en file d'attente pour le téléchargement séquentiel. Vous pouvez également stocker chaque image dans un document distinct (permet le téléchargement parallèle) et ajouter uniquement les _ids des documents image dans votre document utilisateur. Pour tout faire en une seule requête: Base64-encoder vos images et les inclure dans votre document JSON (laid en termes de performance). –

+0

Si vous obtenez une erreur: "aucune correspondance trouvée: ..." mettez l'URL dans les guillemets: curl -v -X PUT 'http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af/artwork.jpg? rev = 2-2739352689 '--data-binary @ artwork.jpg -H "Type de contenu: image/jpg" – Andriy

2

Voici un moyen de télécharger une pièce jointe dans la même requête que la création du document.

curl -X POST 'http://user:[email protected]:5984/client_stuff' -H 'Content-Type: application/json' -d '{"stuff": "stuff", "_attachments": { 
    "empty.gif": { 
     "content_type": "image/gif", 
     "data": "'$(openssl base64 < file.gif)'" 
    } 
    } 
}' 

Selon votre cas d'utilisation, le codage Base64 n'est peut-être pas si mauvais.

Plus d'info: http://wiki.apache.org/couchdb/HTTP_Document_API#Inline_Attachments

5

Cela fonctionne pour moi, et semble un peu plus simple. Le premier doit être lors de la création du document, si vous n'ajoutez pas de rev. Mes exemples utilisent la base de données "test1".

$ curl -H "Content-Type: image/jpeg" -X PUT --data-binary @test01.jpg 'http://username:[email protected]:5984/test1/client_info/test01.jpg' 

{"ok":true,"id":"client_info","rev":"1-8584b6af9d0c3347ba08202697f09952"} 

$ curl -H "Content-Type: image/jpeg" -X PUT --data-binary @test02.jpg 'http://username:[email protected]:5984/test1/client_info/test02.jpg?rev=1-8584b6af9d0c3347ba08202697f09952' 

{"ok":true,"id":"client_info","rev":"2-623b94aba30944d6744f5c11cf03fc10"} 
+0

Cela me semble bon. – span

Questions connexes