[SalesForce] Uploading a file to Chatter – REST API

I'm trying to upload a file to Chatter files using the REST API but I'm getting the following error :

Binary data included but file attachment information is missing. If
providing rich JSON/XML input in multipart REST, make sure to include
Content-Type header in the part.

here's the related code :

Part[] parts = {
            new StringPart("fileName", "Test.7z"),
            new StringPart("Content-Type","multipart/form-data;  boundary=boundary_string"),
            new FilePart("feedItemFileUpload", newContentFile)        
  };

I tried with Content-Type : application/json; charset=UTF-8 but it doesn't change anything.

Best Answer

Here is some Java code that uploads Attachments that you may be able to use as a starting point:

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();
        }
    }
}

A few more details here.

Related Topic