2011-10-20 15 views
8

PROBLEMACouchDB on-the-fly archivos adjuntos a través de línea de comandos

Quiero ser capaz de unir un/archivo adjunto (s) múltiple como se crea el documento, a través de la línea de comandos (ver más abajo) . Solo puedo hacer que esto funcione en Futon (Couchbase), pero solo después de que ya se haya creado un documento.

me han tratado los siguientes:

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

Esto sólo da como resultado el siguiente error:

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

Gracias

Respuesta

16

debe cargar el archivo adjunto en un paso separado, que contiene el real archivo adjunto en el cuerpo de la solicitud. Así que primero crea tu documento normal, luego emite otra solicitud donde cargues el archivo. Aquí hay un ejemplo de cómo cargar un archivo adjunto utilizando rizo (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"

Y aquí es la API oficial para los archivos adjuntos: http://wiki.apache.org/couchdb/HTTP_Document_API#Standalone_Attachments

+0

Así que primero necesito crear el documento, obtener un _rev y luego usar PUT para finalmente adjuntar una imagen? ¿Por qué no es posible hacer esto simultáneamente? ¿Qué sucede si la información que deseo ingresar proviene de un formulario de registro, donde el usuario tiene la capacidad de cargar una o más imágenes? ¿Cómo voy a hacer esto? – EdvardG

+0

Si está buscando un almacenamiento altamente escalable para objetos binarios que escriben en un cubo al mismo tiempo, CouchDB puede no ser su primera opción. Todavía hay varias soluciones para su problema: almacene localmente copias de las imágenes cargadas y póngalas en cola para la carga secuencial. De forma alternativa, almacene cada imagen en un documento distinto (permite la carga en paralelo) y solo agregue los _ids de los documentos de imagen en su documento de usuario. Para hacer todo en una sola solicitud: Base64: codifique sus imágenes e inclúyalas en su documento JSON (feo en términos de rendimiento). –

+0

Si se produce un error: "no dio ningún resultado: ..." poner la URL en las comillas: rizo -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

Aquí hay una manera de cargar un archivo adjunto en la misma solicitud que la creación 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)'" 
    } 
    } 
}' 

Dependiendo de su caso de uso, la codificación Base64 puede no ser tan mala.

Más información: http://wiki.apache.org/couchdb/HTTP_Document_API#Inline_Attachments

5

Esto funciona para mí, y parece un poco más simple. El primero debe ser al crear el documento, si no agrega un rev. Mis ejemplos usan la base de datos "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

Se ve bien conmigo. – span

Cuestiones relacionadas