Exporting the body of an Attachment using the REST API is fairly straightforward: the “Body” field of the Attachment JSON contains the URL to GET the raw bytes for the Attachment body from. But it took me a while to get the importing of an Attachment and its body to work because PATCH or POST to the equivalent body URL is not allowed.
This documentation Insert or Update Blob Data explains generically what needs to be done. But it took me a bit of time to work out how to do this in Java using the Apache HttpClient. Here is a stripped down version of what I ended up with that might help you if you are writing similar Java code:
package com.claimvantage.ant;
import java.io.File;
import java.io.IOException;
import java.io.OutputStream;
import org.apache.commons.httpclient.HttpClient;
import org.apache.commons.httpclient.HttpStatus;
import org.apache.commons.httpclient.methods.PostMethod;
import org.apache.commons.httpclient.methods.multipart.FilePart;
import org.apache.commons.httpclient.methods.multipart.MultipartRequestEntity;
import org.apache.commons.httpclient.methods.multipart.Part;
import org.apache.commons.httpclient.methods.multipart.PartBase;
public class AttachmentExample {
private class JsonPart extends PartBase {
private byte[] bytes;
public JsonPart(String name, String json) throws IOException {
super(name, "application/json", "UTF-8", null);
this.bytes = json.getBytes("UTF-8");
}
@Override
protected void sendData(OutputStream os) throws IOException {
os.write(bytes);
}
@Override
protected long lengthOfData() throws IOException {
return bytes.length;
}
}
private String baseUrl; // Initialization not shown here
private String sessionId; // Initialization not shown here
/**
* Create attachment SObject from its JSON populating its Body from a file at the same time.
*/
public void createAttachment(String attachmentJson, File attachmentFile) throws Exception {
PostMethod post = new PostMethod(baseUrl + "/services/data/v23.0/sobjects/Attachment");
post.setRequestHeader("Authorization", "OAuth " + sessionId);
Part[] parts = new Part[] {
new JsonPart("Json", attachmentJson),
new FilePart("Body", attachmentFile)
};
post.setRequestEntity(new MultipartRequestEntity(parts, post.getParams()));
try {
new HttpClient().executeMethod(post);
if (post.getStatusCode() == HttpStatus.SC_CREATED) {
// Logic for OK
} else {
// Error handling logic
}
} finally {
post.releaseConnection();
}
}
}


