Send Image In Json Request
I'm using JSON with REST api for using web service. Now I also need to send Images in request. Is it possible? If yes, what changes do I need to do on client/server side. And in my
Solution 1:
The way to do that would be to send it as content inside a HttpPost request as below
HttpClientclient=newDefaultHttpClient();
HttpPostpostRequest=newHttpPost(url);
Stringbody= getMessageBody();
try
{
postRequest.setEntity(newStringEntity(body, "UTF8"));
postRequest.setHeader("Content-Type", "application/x-www-form-urlencoded");
HttpResponseresponse= client.execute(postRequest);
return response;
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
} catch (ClientProtocolException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
The way you would string encode the image would be to do the following.
BufferedImageimg= ImageIO.read(newFile("filename.jpg"));
ByteArrayOutputStreambaos=newByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
baos.flush();
Base64base=newBase64(false);
StringencodedImage= base.encodeToString(baos.toByteArray());
baos.close();
encodedImage = java.net.URLEncoder.encode(encodedImage, "ISO-8859-1");
Good luck
Solution 2:
Sample app side code that worked for me. You can send image in one valuepair and the json in another valuepair: (Here "uploadedfile" tag defines the valuepair as the path of the image file in sd card during checking in post function, other tags will be considered as text data)
List<NameValuePair> values; values = new ArrayList<NameValuePair>();
System.out.println(Constants.all_datas.get(pos).getBookName());
values.add(new NameValuePair("uploadedfile",
Constants.book_image_path
+ Constants.all_datas.get(pos).getImage()));
values.add(new NameValuePair("id", Constants.all_datas.get(pos)
.getBookid() + ""));
values.add(new NameValuePair("bookname", Constants.all_datas
.get(pos).getBookName()));
values.add(new NameValuePair("price", Constants.all_datas.get(
pos).getPrice()));
values.add(new NameValuePair("writtername", Constants.all_datas
.get(pos).getWritterName()));
values.add(new NameValuePair("publishername",
Constants.all_datas.get(pos).getPublisherName()));
post(values);
// Post Function
publicvoidpost(final List<NameValuePair> nameValuePairs) {
// Setting progressDialog properties
progressDialog = ProgressDialog.show(CustomBookActivity.this, "",
"Syncing Book Data...");
mHandler = newHandler();
// Function to run after thread
mUpdateResults = newRunnable() {
publicvoidrun() {
progressDialog.dismiss();
// Something
}
};
newThread() {
@Overridepublicvoidrun() {
HttpClienthttpClient=newDefaultHttpClient();
HttpContextlocalContext=newBasicHttpContext();
HttpPosthttpPost=newHttpPost(URL);
try {
MultipartEntityentity=newMultipartEntity(
HttpMultipartMode.BROWSER_COMPATIBLE);
for (intindex=0; index < nameValuePairs.size(); index++) {
if (nameValuePairs.get(index).getName()
.equalsIgnoreCase("uploadedfile")) {
// If the key equals to "uploadedfile", we use FileBody// to transfer the data
entity.addPart(
nameValuePairs.get(index).getName(),
newFileBody(newFile(nameValuePairs.get(
index).getValue())));
} else {
// Normal string data
entity.addPart(nameValuePairs.get(index).getName(),
newStringBody(nameValuePairs.get(index)
.getValue()));
}
}
httpPost.setEntity(entity);
HttpResponseresponse= httpClient.execute(httpPost,
localContext);
HttpEntityresult_entity= response.getEntity();
StringhtmlResponse= EntityUtils.toString(result_entity);
result = htmlResponse;
System.out.println("SYNC:::" + result);
// server = true;
} catch (IOException e) {
e.printStackTrace();
// server = false;
}
// dismiss the progress dialog// Calling post function
mHandler.post(mUpdateResults);
}
}.start();
}
Apache Mime4J, HTTPCore, HTTPMime libary jars need to be added to project
Solution 3:
I use this code in my AsyncTask:
@Overrideprotected String doInBackground(String... str) {
ByteArrayOutputStreambaos=newByteArrayOutputStream();
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
StringencodedImage= bitmapToString(mBitmap);
ArrayList<NameValuePair> nameValuePairs = newArrayList<NameValuePair>();
nameValuePairs.add(newBasicNameValuePair("data", encodedImage));
try {
HttpClienthttpclient=newDefaultHttpClient();
HttpPosthttppost=newHttpPost(
"http://192.168.0.107:8300/upload/upload");
httppost.setEntity(newUrlEncodedFormEntity(nameValuePairs));
HttpResponseresponse= httpclient.execute(httppost);
Stringthe_string_response= convertResponseToString(response);
return the_string_response;
} catch (Exception e) {
System.out.println("Error in http connection " + e.toString());
return"error";
}
}
public String bitmapToString(Bitmap bitmap) {
ByteArrayOutputStreambaos=newByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
Stringtemp=null;
try {
System.gc();
temp = Base64.encodeToString(b, Base64.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
} catch (OutOfMemoryError e) {
baos = newByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, baos);
b = baos.toByteArray();
temp = Base64.encodeToString(b, Base64.DEFAULT);
Log.e("PictureDemo", "Out of memory error catched");
}
return temp;
}
private String convertResponseToString(HttpResponse response)throws IllegalStateException, IOException {
Stringres="";
StringBufferbuffer=newStringBuffer();
inputStream = response.getEntity().getContent();
intcontentLength= (int) response.getEntity().getContentLength();
if (contentLength < 0) {
} else {
byte[] data = newbyte[512];
intlen=0;
try {
while (-1 != (len = inputStream.read(data))) {
buffer.append(newString(data, 0, len));
}
} catch (IOException e) {
e.printStackTrace();
}
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
res = buffer.toString();
}
return res;
}
Solution 4:
You should not send the image itself, but url from which it can be downloaded.
Otherwise:
- you make the request too big
- usually you would like to load the images asynchronously, which can only be achieved if the contents are separated from the other data.
- you most probably would not be able to make use of automatic JSON parsing libraries like GSON, Jackson, or the integrated in the Adnroid SDK
AndroidObject
Post a Comment for "Send Image In Json Request"