| {% include anchor.html edit="true" title="Save an attachment" hash="save_attachment" %} | |
| {% highlight js %} | |
| db.putAttachment(docId, attachmentId, [rev], attachment, type, [callback]); | |
| {% endhighlight %} | |
| Attaches a binary object to a document. | |
| This method will update an existing document to add the attachment, so it requires a `rev` if the document already exists. If the document doesn't already exist, then this method will create an empty document containing the attachment. | |
| What's the point of attachments? If you're dealing with large binary data (such as PNGs), you may incur a performance or storage penalty if you naïvely include them as base64- or hex-encoded strings inside your documents. But if you insert the binary data as an attachment, then PouchDB will attempt to store it in [the most efficient way possible](http://pouchdb.com/faq.html#data_types). | |
| For details, see the [CouchDB documentation on attachments](https://wiki.apache.org/couchdb/HTTP_Document_API#Attachments). | |
| #### Example Usage: | |
| {% include code/start.html id="attach1" type="callback" %} | |
| {% highlight js %} | |
| var attachment = new Blob(['Is there life on Mars?'], {type: 'text/plain'}); | |
| db.putAttachment('doc', 'att.txt', attachment, 'text/plain', function(err, res) { | |
| if (err) { return console.log(err); } | |
| // handle result | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="attach1" type="async" %} | |
| {% highlight js %} | |
| try { | |
| var attachment = new Blob(['Is there life on Mars?'], {type: 'text/plain'}); | |
| var result = await db.putAttachment('doc', 'att.txt', attachment, 'text/plain'); | |
| } catch (err) { | |
| console.log(err); | |
| } | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="attach1" type="promise" %} | |
| {% highlight js %} | |
| var attachment = new Blob(['Is there life on Mars?'], {type: 'text/plain'}); | |
| db.putAttachment('doc', 'att.txt', attachment, 'text/plain').then(function (result) { | |
| // handle result | |
| }).catch(function (err) { | |
| console.log(err); | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| #### Example Response: | |
| {% highlight js %} | |
| { | |
| "ok": true, | |
| "id": "doc", | |
| "rev": "2-068E73F5B44FEC987B51354DFC772891" | |
| } | |
| {% endhighlight %} | |
| Within Node, you must use a `Buffer` instead of a `Blob`: | |
| {% highlight js %} | |
| var attachment = new Buffer('Is there life on Mars?'); | |
| {% endhighlight %} | |
| For details, see the [Mozilla docs on `Blob`](https://developer.mozilla.org/en-US/docs/Web/API/Blob) or the [Node docs on `Buffer`](http://nodejs.org/api/buffer.html). | |
| If you need a shim for older browsers that don't support the `Blob` constructor, or you want some convenience methods for Blobs, you can use [blob-util](https://github.com/nolanlawson/blob-util). | |
| #### Save a base64 attachment | |
| If you supply a string instead of a `Blob`/`Buffer`, then it will be assumed to be a base64-encoded string, and will be processed accordingly: | |
| {% include code/start.html id="attach3" type="callback" %} | |
| {% highlight js %} | |
| var attachment = | |
| "TGVnZW5kYXJ5IGhlYXJ0cywgdGVhciB1cyBhbGwgYXBhcnQKTWFrZS" + | |
| "BvdXIgZW1vdGlvbnMgYmxlZWQsIGNyeWluZyBvdXQgaW4gbmVlZA=="; | |
| db.putAttachment('doc', 'att.txt', attachment, 'text/plain', function(err, res) { | |
| if (err) { return console.log(err); } | |
| // handle result | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="attach3" type="async" %} | |
| {% highlight js %} | |
| try { | |
| var attachment = | |
| "TGVnZW5kYXJ5IGhlYXJ0cywgdGVhciB1cyBhbGwgYXBhcnQKTWFrZS" + | |
| "BvdXIgZW1vdGlvbnMgYmxlZWQsIGNyeWluZyBvdXQgaW4gbmVlZA=="; | |
| var result = await db.putAttachment('doc', 'att.txt', attachment, 'text/plain'); | |
| } catch (err) { | |
| console.log(err); | |
| } | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="attach3" type="promise" %} | |
| {% highlight js %} | |
| var attachment = | |
| "TGVnZW5kYXJ5IGhlYXJ0cywgdGVhciB1cyBhbGwgYXBhcnQKTWFrZS" + | |
| "BvdXIgZW1vdGlvbnMgYmxlZWQsIGNyeWluZyBvdXQgaW4gbmVlZA=="; | |
| db.putAttachment('doc', 'att.txt', attachment, 'text/plain').then(function (result) { | |
| // handle result | |
| }).catch(function (err) { | |
| console.log(err); | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| #### Save an inline attachment | |
| You can also inline attachments inside the document. The attachment data may be supplied as a base64-encoded string with the `content_type`: | |
| {% include code/start.html id="attach2" type="callback" %} | |
| {% highlight js %} | |
| var doc = { | |
| "_id": "doc", | |
| "title": "Legendary Hearts", | |
| "_attachments": { | |
| "att.txt": { | |
| "content_type": "text/plain", | |
| "data": "TGVnZW5kYXJ5IGhlYXJ0cywgdGVhciB1cyBhbGwgYXBhcnQKTWFrZS" + | |
| "BvdXIgZW1vdGlvbnMgYmxlZWQsIGNyeWluZyBvdXQgaW4gbmVlZA==" | |
| } | |
| } | |
| }; | |
| db.put(doc, function (err, result) { | |
| if (err) { return console.log(err); } | |
| // handle result | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="attach2" type="async" %} | |
| {% highlight js %} | |
| try { | |
| var doc = { | |
| "_id": "doc", | |
| "title": "Legendary Hearts", | |
| "_attachments": { | |
| "att.txt": { | |
| "content_type": "text/plain", | |
| "data": "TGVnZW5kYXJ5IGhlYXJ0cywgdGVhciB1cyBhbGwgYXBhcnQKTWFrZS" + | |
| "BvdXIgZW1vdGlvbnMgYmxlZWQsIGNyeWluZyBvdXQgaW4gbmVlZA==" | |
| } | |
| } | |
| }; | |
| var result = await db.put(doc); | |
| } catch (err) { | |
| console.log(err); | |
| } | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="attach2" type="promise" %} | |
| {% highlight js %} | |
| var doc = { | |
| "_id": "doc", | |
| "title": "Legendary Hearts", | |
| "_attachments": { | |
| "att.txt": { | |
| "content_type": "text/plain", | |
| "data": "TGVnZW5kYXJ5IGhlYXJ0cywgdGVhciB1cyBhbGwgYXBhcnQKTWFrZS" + | |
| "BvdXIgZW1vdGlvbnMgYmxlZWQsIGNyeWluZyBvdXQgaW4gbmVlZA==" | |
| } | |
| } | |
| }; | |
| db.put(doc).then(function (result) { | |
| // handle result | |
| }).catch(function (err) { | |
| console.log(err); | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| #### Save an inline Blob/Buffer attachment | |
| You can also inline `Blob`s/`Buffer`s: | |
| {% include code/start.html id="attach4" type="callback" %} | |
| {% highlight js %} | |
| var doc = { | |
| "_id": "doc", | |
| "title": "Legendary Hearts", | |
| "_attachments": { | |
| "att.txt": { | |
| "content_type": "text/plain", | |
| "data": new Blob(['Is there life on Mars?'], {type: 'text/plain'}) | |
| } | |
| } | |
| }; | |
| db.put(doc, function (err, result) { | |
| if (err) { return console.log(err); } | |
| // handle result | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="attach4" type="async" %} | |
| {% highlight js %} | |
| try { | |
| var doc = { | |
| "_id": "doc", | |
| "title": "Legendary Hearts", | |
| "_attachments": { | |
| "att.txt": { | |
| "content_type": "text/plain", | |
| "data": new Blob(['Is there life on Mars?'], {type: 'text/plain'}) | |
| } | |
| } | |
| }; | |
| var result = await db.put(doc); | |
| } catch (err) { | |
| console.log(err); | |
| } | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="attach4" type="promise" %} | |
| {% highlight js %} | |
| var doc = { | |
| "_id": "doc", | |
| "title": "Legendary Hearts", | |
| "_attachments": { | |
| "att.txt": { | |
| "content_type": "text/plain", | |
| "data": new Blob(['Is there life on Mars?'], {type: 'text/plain'}) | |
| } | |
| } | |
| }; | |
| db.put(doc).then(function (result) { | |
| // handle result | |
| }).catch(function (err) { | |
| console.log(err); | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| #### Save many attachments at once | |
| The inline approach allows you to save multiple attachments to the same document in a single shot: | |
| {% include code/start.html id="attach5" type="callback" %} | |
| {% highlight js %} | |
| var doc = { | |
| "_id": "doc", | |
| "title": "Legendary Hearts", | |
| "_attachments": { | |
| "att.txt": { | |
| "content_type": "text/plain", | |
| "data": new Blob( | |
| ["And she's hooked to the silver screen"], | |
| {type: 'text/plain'}) | |
| }, | |
| "att2.txt": { | |
| "content_type": "text/plain", | |
| "data": new Blob( | |
| ["But the film is a saddening bore"], | |
| {type: 'text/plain'}) | |
| }, | |
| "att3.txt": { | |
| "content_type": "text/plain", | |
| "data": new Blob( | |
| ["For she's lived it ten times or more"], | |
| {type: 'text/plain'}) | |
| } | |
| } | |
| }; | |
| db.put(doc, function (err, result) { | |
| if (err) { return console.log(err); } | |
| // handle result | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="attach5" type="async" %} | |
| {% highlight js %} | |
| try { | |
| var doc = { | |
| "_id": "doc", | |
| "title": "Legendary Hearts", | |
| "_attachments": { | |
| "att.txt": { | |
| "content_type": "text/plain", | |
| "data": new Blob( | |
| ["And she's hooked to the silver screen"], | |
| {type: 'text/plain'}) | |
| }, | |
| "att2.txt": { | |
| "content_type": "text/plain", | |
| "data": new Blob( | |
| ["But the film is a saddening bore"], | |
| {type: 'text/plain'}) | |
| }, | |
| "att3.txt": { | |
| "content_type": "text/plain", | |
| "data": new Blob( | |
| ["For she's lived it ten times or more"], | |
| {type: 'text/plain'}) | |
| } | |
| } | |
| }; | |
| var result = await db.put(doc); | |
| } catch (err) { | |
| console.log(err); | |
| } | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| {% include code/start.html id="attach5" type="promise" %} | |
| {% highlight js %} | |
| var doc = { | |
| "_id": "doc", | |
| "title": "Legendary Hearts", | |
| "_attachments": { | |
| "att.txt": { | |
| "content_type": "text/plain", | |
| "data": new Blob( | |
| ["And she's hooked to the silver screen"], | |
| {type: 'text/plain'}) | |
| }, | |
| "att2.txt": { | |
| "content_type": "text/plain", | |
| "data": new Blob( | |
| ["But the film is a saddening bore"], | |
| {type: 'text/plain'}) | |
| }, | |
| "att3.txt": { | |
| "content_type": "text/plain", | |
| "data": new Blob( | |
| ["For she's lived it ten times or more"], | |
| {type: 'text/plain'}) | |
| } | |
| } | |
| }; | |
| db.put(doc).then(function (result) { | |
| // handle result | |
| }).catch(function (err) { | |
| console.log(err); | |
| }); | |
| {% endhighlight %} | |
| {% include code/end.html %} | |
| See [Inline Attachments](http://wiki.apache.org/couchdb/HTTP_Document_API#Inline_Attachments) | |
| on the CouchDB wiki for details. | |