Store Files in a CouchDB

June 19, 2020 1 minute

      There is a very convenient way to store files inside CouchDB and be able to get them directly from it.

      In a simple way, an attachment is a new field in a document. Lets say we have a document with id e5f46d968b31e400b5db6426d000024b.

      $ curl -X GET http://admin:[email protected]:5984/sandbox/e5f46d968b31e400b5db6426d000024b
      {"_id":"e5f46d968b31e400b5db6426d000024b","_rev":"1-967a00dff5e02add41819138abb3284d"}
      

      and we want to attach some index.html to that document.

      We have two ways to attach a file:

      Attach via Fauxton

      There is an Upload attachment button on a documents page

      http://127.0.0.1:5984/_utils/#database/sandbox/e5f46d968b31e400b5db6426d000024b

      fauxton-attachement-1 image

      Attach via curl

      curl -vX PUT http://127.0.0.1:5984/sandbox/e5f46d968b31e400b5db6426d000024b/index.html?rev=1-967a00dff5e02add41819138abb3284d --data-binary @index.html -H "ContentType: text/html"
      

      Attachment structure

      As a result, we will have an additional field _attachments which will contain all files that we attached. In our case, it’s index.html only.

      {
        "_id": "e5f46d968b31e400b5db6426d000024b",
        "_rev": "2-83c73b6b3427d2bb5a8fc5492c6320f8",
        "_attachments": {
          "index.html": {
            "content_type": "text/html",
            "revpos": 2,
            "digest": "md5-MyN94QzefBF07zIZQ7D4jg==",
            "length": 14,
            "stub": true
          }
        }
      }
      

      It’s super easy to get and it’s accessible as a simple page

      curl -X GET http://admin:[email protected]:5984/sandbox/e5f46d968b31e400b5db6426d000024b/index.html
      <html></html>
      

      Have a comment on one of my posts? Start a discussion in my public inbox by sending an email to ~histrio/[email protected] [mailing list etiquette]