You need to sign in to do that
Don't have an account?
Chatur
Chatter REST API - File Upload using Request body
Hi Everyone,
I am trying to upload a file in Chatter by REST API using request body - Since we are not able to send @Mention text with request parameter, we are using request body instead of request parameter to send the file Attachment with feed text having @Mentions together.
Please reply it, if anybody has worked on similar problem earlier or has any clue for resolution.
Hi Chatur,
To upload a file for a new feed item in the Chatter REST API, you have to make a multipart request, using the content type "multipart/form-data". This sort of request requires you to define a "boundary" to go between parts, there are examples online. Be careful to get the correct newlines after boundaries and to include a boundary at the end. Each "part" in a multipart request can have its own content-type, so supply your rich body with @ mentions as JSON or XML in an "application/json" or "application/xml" part. The binary file data should be provided in an "image/jpeg" or "application/octet-stream" part named "feedItemFileUpload".
There is some example code here: https://github.com/cseymourSF/Chatter-API-iOS-Sample/blob/master/Classes/UserPhotoPoster.m which shows how to upload a file in a multipart request (this isn't a feed item post, so it doesn't inlcude a json/xml part, this code is just used for setting someone's user profile photo, but it should be somewhat helpful).
Let us know how it goes.
Cheers,
- Chris
Hi,
I am trying to implement upload functionality but I am getting a 500 internal server error.
I am submitting a form first from client side:
<form action='"+ url +"' id='upload_form' enctype='multipart/form-data' method='POST'><li>File to upload: <input type='file' name='upfile'><br><input id='upload_with_atttachment' type='submit' name='uploadedFile' value='Upload'><input type='hidden' name='status' value='"+ status_post +"'><input type='hidden' name='accesstoken' value='"+ token +"'><input type='hidden' name='instanceurl' value='"+ instanceurl +"'> <a id='cancel_upload'>close</a></li></form>
and hitting the rest api which does the following:
@RequestMapping(value="/updateStatus/",method=RequestMethod.POST)
@ResponseBody
public String updateStatus(@RequestHeader("accesstoken") String token,@RequestHeader("instanceurl") String instance,@RequestParam("status") String status,@RequestParam("upfile") File Ufile )
throws IOException, AppException
{
String fileName = "fileUp";
String respBody = "";
String url="/services/data/v24.0/chatter/feeds/news/me/feed-items";
Part[] parts = {
new StringPart("fileName", fileName),
new StringPart("text", status),
new FilePart("feedItemFileUpload", Ufile),
};
PostMethod pm = new PostMethod(instance + url);
pm.setRequestEntity(new MultipartRequestEntity(parts, pm.getParams()));
pm.setRequestHeader("Authorization", "OAuth "+token);
pm.setRequestHeader("Content-Type", "multipart/form-data");
try {
logger.info("updateStatus execute");
httpclient.executeMethod(pm);
respBody = pm.getResponseBodyAsString();
logger.info("Salesforce: updateStatus(): Response body: " + respBody);
} catch (HttpException e1){
logger.info("Error occurred in Salesforce updateStatus():HttpException ", e1.getMessage());
throw new AppException(e1.getMessage());
} catch (IOException e2) {
logger.info("Error occurred in Salesforce updateStatus():IOException ", e2.getMessage());
throw new AppException(e2.getMessage());
} finally {
pm.releaseConnection();
}
return respBody;
}
Can you please tell me where I am wrong!
Thanks!!!!
Sorry I can't tell from your code, I dont' know anything about the libraries you're using. A trace of the exact HTTP request being sent would help.
I would like to know how to send the information from client side. Do I strictly need to do a form post with enctype="multipart/form-data"?
Also in the chatter pdf there is a sample java code. there is a function called getFile(), what is that function exactly doing.
what should be the type of feedItemFileUpload parameter. is that file path location or the binary file itself?
The java code which I have used is the same as the snippet which was given in the documentation. so am I doing something wrong in the way I am sending data?
Thanks!
I don't understand the header you posted. It shows a content-type of "application/x-www-form-urlencoded;" but the code you posted is using multipart. You have to use multipart to post a file binary.
Any HTTP request that includes binary data must be sent with content type "multipart/form-data". I don't know what an "enctype" is.
feedItemFileUpload is the name of the binary part that must be included in your multipart request
Which documentation did you find a snippet in?
Again, I don't really know the details of the client programming environment you are using. If you post the exact raw HTTP request from a sniffer like WireShark then I might be able to help.
I got the java snippet from the following document:
http://www.salesforce.com/us/developer/docs/chatterapi/salesforce_chatter_rest_api.pdf
page no:101 : example in Java of updating a news feed with a file post
Sorry, it looks like that sample code is wrong at least in the content-type value. The content type must be multipart. If you provide me with the raw HTTP request you're sending from Wireshark or Fiddler then I cant give you more assistance, I don't know anything about how Java creates HTTP requests.
multipart/form-data; boundary=---------------------------283232113224472
The request header you've posted looks fine. I need to see the full request to help figure out what's wrong. There are sub-headers inside for each of the 3 parts you're sending.