2011-10-20 6 views
8

PROBLEMACouchDB on-the-fly allegati tramite riga di comando

voglio essere in grado di collegare una/attacco multiplo (s) come viene creato il documento, attraverso la linea di comando (vedi sotto) . Posso solo farlo funzionare in Futon (Couchbase), ma solo dopo che un documento è già stato creato.

ho provato quanto segue:

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   
    } 
    } 
}' 

Questo solo i risultati il ​​seguente errore:

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

Grazie

risposta

16

È necessario caricare il tuo attaccamento in una fase separata, contenente l'attuale file allegato nel corpo della richiesta. Quindi, prima crea il tuo documento regolare, quindi invia un'altra richiesta dove carichi il file. Ecco un esempio su come caricare un allegato con ricciolo (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"

Ed ecco l'API ufficiale per gli allegati: http://wiki.apache.org/couchdb/HTTP_Document_API#Standalone_Attachments

+0

Quindi prima devo creare il documento, ottenere un _rev e poi usare PUT per allegare finalmente un'immagine? Perché non è possibile farlo contemporaneamente? Cosa succede se le informazioni che desidero inserire provengono da un modulo di registrazione, in cui l'utente ha la possibilità di caricare una o più immagini? Come potrei fare questo? – EdvardG

+0

Se stai cercando una memoria altamente scalabile per oggetti binari che scrivono in qualcosa come un secchio contemporaneamente, CouchDB potrebbe non essere la tua prima scelta. Esistono ancora diverse soluzioni per il problema: archiviare localmente copie locali delle immagini caricate e metterle in coda per il caricamento sequenziale. In alternativa, memorizzare ciascuna immagine in un documento distinto (consente il caricamento parallelo) e aggiungere solo le _id dei documenti immagine nel documento dell'utente. Per fare tutto in un'unica richiesta: Base64: codifica le tue immagini e includile nel tuo documento JSON (brutto in termini di prestazioni). –

+0

Se si verifica un errore: "nessuna corrispondenza trovata: ..." inserire l'url tra virgolette: 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" – Andriy

2

Ecco un modo per caricare un allegato nella stessa richiesta della creazione del documento.

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)'" 
    } 
    } 
}' 

A seconda del caso d'uso, la codifica Base64 potrebbe non essere così male.

Maggiori informazioni: http://wiki.apache.org/couchdb/HTTP_Document_API#Inline_Attachments

5

Questo funziona per me, e sembra un po 'più semplice. Il primo deve essere quando si crea il documento, se non si aggiunge un rev. I miei esempi utilizzano il database "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

Mi sembra buono. – span