2011-10-20 8 views
8

VẤN ĐỀCouchDB On-the-fly file đính kèm thông qua dòng lệnh

Tôi muốn để có thể đính kèm một/nhiều tập tin đính kèm (s) như các tài liệu được tạo ra, thông qua các dòng lệnh (xem dưới đây) . Tôi chỉ có thể có được điều này để làm việc trong Futon (Couchbase), nhưng chỉ sau khi một tài liệu đã được tạo ra.

Tôi đã thử những điều sau đây:

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

này chỉ kết quả trong các lỗi sau:

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

Cảm ơn

Trả lời

16

Bạn phải tải lên tập tin đính kèm của bạn trong một bước riêng biệt, chứa thực tế tệp đính kèm trong phần yêu cầu. Vì vậy, trước tiên hãy tạo tài liệu thông thường của bạn, sau đó đưa ra yêu cầu khác nơi bạn tải lên tệp. Dưới đây là một ví dụ về cách tải lên một tập tin đính kèm sử dụng curl (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"

Và đây là API chính thức cho file đính kèm: http://wiki.apache.org/couchdb/HTTP_Document_API#Standalone_Attachments

+0

Vì vậy, trước tiên tôi cần tạo tài liệu, nhận _rev và sau đó sử dụng PUT để cuối cùng đính kèm hình ảnh? Tại sao không thể thực hiện việc này đồng thời? Điều gì sẽ xảy ra nếu thông tin tôi muốn nhập từ biểu mẫu đăng ký, nơi người dùng có khả năng tải lên một hoặc nhiều hình ảnh? Tôi sẽ đi đâu để tới đó? – EdvardG

+0

Nếu bạn đang tìm kiếm một lưu trữ có khả năng mở rộng cao cho các đối tượng nhị phân viết vào một cái gì đó giống như một thùng đồng thời, CouchDB có thể không phải là lựa chọn đầu tiên của bạn. Vẫn còn một số giải pháp cho sự cố của bạn: Lưu trữ các bản sao cục bộ của các hình ảnh được tải lên cục bộ và xếp hàng chúng để tải lên liên tục. Ngoài ra, lưu trữ từng hình ảnh trong một tài liệu riêng biệt (cho phép tải lên song song) và chỉ thêm các _ids của tài liệu hình ảnh trong tài liệu người dùng của bạn. Để làm mọi thứ trong một yêu cầu: Base64 mã hóa hình ảnh của bạn và đưa chúng vào tài liệu JSON của bạn (xấu về hiệu suất). –

+0

Nếu bạn gặp lỗi: "không tìm thấy kết quả phù hợp: ...", hãy đặt url vào dấu ngoặc kép: curl -v -X PUT 'http://127.0.0.1:5984/albums/6e1295ed6c29495e54cc05947f18c8af/artwork.jpg? rev = 2-2739352689 '--data-binary @ artwork.jpg -H "Kiểu nội dung: hình ảnh/jpg" – Andriy

2

Đây là một cách để tải lên tệp đính kèm trong cùng một yêu cầu khi tạo tài liệu.

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

Tùy thuộc vào trường hợp sử dụng của bạn, mã hóa Base64 có thể không quá tệ.

Thông tin thêm: http://wiki.apache.org/couchdb/HTTP_Document_API#Inline_Attachments

5

này làm việc cho tôi, và dường như đơn giản hơn một chút. Điều đầu tiên phải là khi tạo tài liệu, nếu bạn không thêm bản chỉnh sửa. Ví dụ của tôi sử dụng cơ sở dữ liệu "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

Có vẻ phù hợp với tôi. – span