How to send multiple images to server using MultipartEntity from android

How to send multiple images to server using MultipartEntity from android



Hello I am sending Images and Text to php webservice using following code.


try


HttpClient httpClient = new DefaultHttpClient();
HttpContext localContext = new BasicHttpContext();
HttpPost httpPost = new HttpPost(URL);

MultipartEntity entity = new MultipartEntity(
HttpMultipartMode.BROWSER_COMPATIBLE);

ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.JPEG, 75, bos);
byte data = bos.toByteArray();

entity.addPart("files",
new ByteArrayBody(data, "myImage.jpg"));

entity.addPart("message0", new StringBody(caption.getText()
.toString()));

httpPost.setEntity(entity);
HttpResponse response = httpClient.execute(httpPost,
localContext);
BufferedReader reader = new BufferedReader(
new InputStreamReader(
response.getEntity().getContent(), "UTF-8"));

String sResponse = reader.readLine();
return sResponse;
catch (Exception e)
if (dialog.isShowing())
dialog.dismiss();
Toast.makeText(ImageUpload.this, e.getMessage(),
Toast.LENGTH_LONG).show();
Log.e(e.getClass().getName(), e.getMessage(), e);
return null;


}



It work perfectly. But this is for only one image send. Now i send 5 images and text with it.



Example:- Image1 - Text1

Image2 - Text2 etc..



So I am confuse about how to store 5 images one by one and at final submit click send images and text associated with it to server.



I am get image from Camera only.


Intent intent = new Intent();
intent.setType("image/*");
intent.setAction(Intent.ACTION_GET_CONTENT);
startActivityForResult(
Intent.createChooser(intent, "Select Picture"),
PICK_IMAGE);


public void onActivityResult_photo(int requestCode, int resultCode,
Intent data)
// TODO Auto-generated method stub
if (resultCode == RESULT_OK)

if (data != null)
mImageCaptureUri = data.getData();
display(mImageCaptureUri);
else
Toast.makeText(CustomTabActivity.mTabHost.getContext(),
"No photo selected..", Toast.LENGTH_SHORT).show();







private String display(Uri mImageCaptureUri2)
// TODO Auto-generated method stub
String base64string = null;
try

if (mImageCaptureUri2 != null)

System.gc();

selectedImagePath = getPath(mImageCaptureUri2);

File filenew = new File(selectedImagePath);
int file_size = Integer.parseInt(String.valueOf(filenew
.length() / 1024));
if (file_size <= 10000)
PD1 = ProgressDialog.show(
CustomTabActivity.mTabHost.getContext(), "",
"Loading...");
Handler refresh = new Handler(Looper.getMainLooper());

refresh.post(new Runnable()
public void run()

PD1.setCancelable(true);
Bitmap newbitmap;
newbitmap = decodeFile(selectedImagePath);
ByteArrayOutputStream bs = new ByteArrayOutputStream();
newbitmap.compress(Bitmap.CompressFormat.PNG, 50,
bs);
img.setVisibility(View.VISIBLE);
img.setImageBitmap(newbitmap);
byte abc = bitmapToByteArray(newbitmap);
if (txt_phototext.getText().toString().equals(""))
submit.put(abc, "");
else
submit.put(abc, txt_phototext.getText()
.toString());

// executeMultipartPost();

PD1.dismiss();


);

else
AlertDialog.Builder alertbox = new AlertDialog.Builder(
CustomTabActivity.mTabHost.getContext());
alertbox.setMessage("Take Image Size Less than 10 MB");
alertbox.setNeutralButton("Ok",
new DialogInterface.OnClickListener()
public void onClick(DialogInterface arg0,
int arg1)
finish();

);
alertbox.show();


else
System.out.println("===============NULL========");


catch (Exception e)
// // TODO Auto-generated catch block
// e.printStackTrace();

return base64string;





static Bitmap decodeFile(String str)
try
// decode image size
BitmapFactory.Options o = new BitmapFactory.Options();
o.inJustDecodeBounds = true;
BitmapFactory.decodeStream(new FileInputStream(str), null, o);

// Find the correct scale value. It should be the power of 2.
final int REQUIRED_SIZE = 70;
int width_tmp = o.outWidth, height_tmp = o.outHeight;
int scale = 1;
while (true)
if (width_tmp / 2 < REQUIRED_SIZE


// decode with inSampleSize
BitmapFactory.Options o2 = new BitmapFactory.Options();
o2.inSampleSize = scale;
return BitmapFactory.decodeStream(new FileInputStream(str), null,
o2);
catch (FileNotFoundException e)

return null;





public static byte bitmapToByteArray(Bitmap bitmap)
ByteArrayOutputStream bos = new ByteArrayOutputStream();
bitmap.compress(CompressFormat.PNG, 0 /* ignored for PNG */, bos);
byte bitmapdata = bos.toByteArray();
return bitmapdata;



So Finally i am stuck about this please help.





Uploading multiple files to server The jar files needs to add for this this helps for you in solving your problem.
– Harish
Sep 14 '12 at 12:46




5 Answers
5



And make sure that your directory or folder in server is Executable, Writable and Readable. I had this as the major problem. This is called 777 permission.. Believe me, this is as important as other things to consider.



Try increasing the post_max_size of yout php.ini file in WAMP server



For full detail please have a look on my post Click here



its quite difficult to send multiple images to server using MultipartEntity. I did search for this but didn't find any right solution then i made my own way to send multiple images to server
, here i send array of selected paths to asynctask and in asynctask i sent images to server



Calling Asysnctask Function-
new Upload_Multiple.excute(Array_of_Path))


Private class Upload_Multiple_img extends AsyncTask<String, Void, String>

@Override
protected void onPreExecute()
// TODO Auto-generated method stub
super.onPreExecute();



protected String doInBackground(String... paths_array)



String data = "";

for (int i = 0; i < paths_array.length; i++)

// get_Picture_bitmap() returns bitmap by passing path of image
// get_Picture_bitmap() is mentioned below.
Bitmap bitmap = get_Picture_bitmap(paths_array[i]);

ByteArrayOutputStream stream = new ByteArrayOutputStream();

bitmap.compress(Bitmap.CompressFormat.PNG, 100, stream);
InputStream in = new ByteArrayInputStream(stream.toByteArray()); // convert

DefaultHttpClient httpclient = new DefaultHttpClient();

String server_funtion_url="...serveraddres"+funtion_at_server"";
HttpPost httppost = new HttpPost(server_funtion_url); // server

MultipartEntity reqEntity = new MultipartEntity();

obj_SP = ImagePicker.this.getSharedPreferences("Eperty", 0);

String id_prop = obj_SP.getString("new_prop_id", "");

String Image_Name =
+ String.valueOf(System.currentTimeMillis()) + ".jpg";
// image is a key which is used at server end to get this
reqEntity.addPart("image", Image_Name, in);

httppost.setEntity(reqEntity);

HttpResponse response = null;
try
response = httpclient.execute(httppost);
data = EntityUtils.toString(response.getEntity());
System.out.println("FFFF== " + data);

catch (ClientProtocolException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (IOException e)
// TODO Auto-generated catch block
e.printStackTrace();
catch (ParseException e)
// TODO Auto-generated catch block
e.printStackTrace();





return data;


@Override
protected void onProgressUpdate(Void... values)

super.onProgressUpdate(values);


@Override
protected void onPostExecute(String result)

ConstantData.ToastAlert(ImagePicker.this,
"Images Uploaded successfully");





//);



For compressing the images and getting bitmap for i made below funtion*


public Bitmap get_Picture_bitmap(String imagePath)

long size_file = getFileSize(new File(imagePath));

size_file = (size_file) / 1000;// in Kb now
int ample_size = 1;

if (size_file <= 250)

System.out.println("SSSSS1111= " + size_file);
ample_size = 2;

else if (size_file > 251 && size_file < 1500)

System.out.println("SSSSS2222= " + size_file);
ample_size = 4;

else if (size_file >= 1500 && size_file < 3000)

System.out.println("SSSSS3333= " + size_file);
ample_size = 8;

else if (size_file >= 3000 && size_file <= 4500)

System.out.println("SSSSS4444= " + size_file);
ample_size = 12;

else if (size_file >= 4500)

System.out.println("SSSSS4444= " + size_file);
ample_size = 16;


Bitmap bitmap = null;

BitmapFactory.Options bitoption = new BitmapFactory.Options();
bitoption.inSampleSize = ample_size;

Bitmap bitmapPhoto = BitmapFactory.decodeFile(imagePath, bitoption);

ExifInterface exif = null;
try
exif = new ExifInterface(imagePath);
catch (IOException e)
// Auto-generated catch block
e.printStackTrace();

int orientation = exif
.getAttributeInt(ExifInterface.TAG_ORIENTATION, 1);
Matrix matrix = new Matrix();

if ((orientation == 3))
matrix.postRotate(180);
bitmap = Bitmap.createBitmap(bitmapPhoto, 0, 0,
bitmapPhoto.getWidth(), bitmapPhoto.getHeight(), matrix,
true);

else if (orientation == 6)
matrix.postRotate(90);
bitmap = Bitmap.createBitmap(bitmapPhoto, 0, 0,
bitmapPhoto.getWidth(), bitmapPhoto.getHeight(), matrix,
true);

else if (orientation == 8)
matrix.postRotate(270);
bitmap = Bitmap.createBitmap(bitmapPhoto, 0, 0,
bitmapPhoto.getWidth(), bitmapPhoto.getHeight(), matrix,
true);

else
matrix.postRotate(0);
bitmap = Bitmap.createBitmap(bitmapPhoto, 0, 0,
bitmapPhoto.getWidth(), bitmapPhoto.getHeight(), matrix,
true);



return bitmap;




**



Server end Code *


$target_dir = "../webadmin/user_image/";
$target_dir = $target_dir . basename($_FILES["user_img"]["name"]);
if(move_uploaded_file($_FILES["image"]["tmp_name"], $target_dir))

$msg = "The file ". basename($result[0]). " has been uploaded.";
$send_arr['success'] = 1;
$send_arr['message'] = $msg;
echo json_encode($send_arr);

else

$msg = "Sorry, there was an error uploading your file.";
$send_arr['success'] = 0;
$send_arr['message'] = $msg;
echo json_encode($send_arr);





your link is shows Account Suspended
– MilapTank
Oct 29 '15 at 12:17


Account Suspended





Why you can't just create array of json object of your images to base64 and post to server and at your server api read those images convert to byte and use as image.
– Pramod mishra
May 15 '16 at 3:52



Why you can't just create array of json object of your images to base64 and post to server and at your server api read those images convert to byte and use as image.
Check my answe and try to implement.
In Android how to post data to webservice which is created in WCF?



And the images you are getting from camera store them in uri in sdcard and letter read them. You can assign image name sequntialy. And read them from uri.





because for larger images base 64 string can be really large and sometimes they don't get send completely. So that's why uploading them as a file is a better option.
– Vivek Mishra
Apr 17 '17 at 9:02



Please find the below method...here i m sending mutiple image file using AQUERY. The best lib to perform all background network related task.(Like AJAX).



https://code.google.com/p/android-query/


public void uploadImageFile( String filePath,
String message)

Context context = ApplicationContextProvider.getContext();
String url = SERVER_URL + "/user/uploadImageFile";


try
Toast.makeText(context, "Uploading...", Toast.LENGTH_SHORT)
.show();

String compressedFile = CommonUtilities.compressImage(filePath,
context);

Map<String, Object> params = new HashMap<String, Object>();


File imageFile = new File(compressedFile);
byte imageBytes1 = FileUtils.readFileToByteArray(imageFile);
params.put("imageBytes", imageBytes1);
params.put("message",URLEncoder.encode(message, "UTF-8"));


AQuery aq = new AQuery(context);
aq.ajax(url, params, JSONObject.class,
new AjaxCallback<JSONObject>()
@Override
public void callback(String url, JSONObject json,
AjaxStatus status)
Toast.makeText(
ApplicationContextProvider.getContext(),
"Uploaded successfully",
Toast.LENGTH_SHORT).show();




);
catch (Exception e)
e.printStackTrace();
Toast.makeText(context, e.getMessage(), Toast.LENGTH_SHORT)
.show();







Thanks for sharing bro :)
– Hardik Joshi
Oct 29 '14 at 16:05






By clicking "Post Your Answer", you acknowledge that you have read our updated terms of service, privacy policy and cookie policy, and that your continued use of the website is subject to these policies.

Popular posts from this blog

𛂒𛀶,𛀽𛀑𛂀𛃧𛂓𛀙𛃆𛃑𛃷𛂟𛁡𛀢𛀟𛁤𛂽𛁕𛁪𛂟𛂯,𛁞𛂧𛀴𛁄𛁠𛁼𛂿𛀤 𛂘,𛁺𛂾𛃭𛃭𛃵𛀺,𛂣𛃍𛂖𛃶 𛀸𛃀𛂖𛁶𛁏𛁚 𛂢𛂞 𛁰𛂆𛀔,𛁸𛀽𛁓𛃋𛂇𛃧𛀧𛃣𛂐𛃇,𛂂𛃻𛃲𛁬𛃞𛀧𛃃𛀅 𛂭𛁠𛁡𛃇𛀷𛃓𛁥,𛁙𛁘𛁞𛃸𛁸𛃣𛁜,𛂛,𛃿,𛁯𛂘𛂌𛃛𛁱𛃌𛂈𛂇 𛁊𛃲,𛀕𛃴𛀜 𛀶𛂆𛀶𛃟𛂉𛀣,𛂐𛁞𛁾 𛁷𛂑𛁳𛂯𛀬𛃅,𛃶𛁼

Edmonton

Crossroads (UK TV series)