{% 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="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="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="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": {
    "_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="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": {
    "_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="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.


