Korhan
Korhan

Reputation: 323

Uploading multiple images to server

User can take 5-6 pictures in android side through camera. So, I used ACTION_IMAGE_CAPTURE. In the onActivityResult I do this to collect the bitmap of the image taken by the camera. Suppose for first taken pic and second taken pic as below.

if(requestCode == 1)
{
    bitMap1 = (Bitmap)extras.get("data");
    imageView1.setImageBitmap(bitMap1);
    globalvar = 2;
}
if(requestCode == 2)
{
    bitMap1 = (Bitmap)extras.get("data");
    imageView2.setImageBitmap(bitMap2);
    globalvar = 2;
}

To send these images to the php server, I do the following..

protected String doInBackground(Integer... args) {
            // Building Parameters


    ByteArrayOutputStream bao1 = new ByteArrayOutputStream();
    bitMap1.compress(Bitmap.CompressFormat.JPEG, 90, bao1);
    byte [] bytearray1 = bao1.toByteArray();
    String stringba1 = Base64.encode(bytearray1);


 ByteArrayOutputStream bao2 = new ByteArrayOutputStream();
    bitMap2.compress(Bitmap.CompressFormat.JPEG, 90, bao2);
    byte [] bytearray2 = bao2.toByteArray();
    String stringba2 = Base64.encode(bytearray2);


            String parameter1 = "tenant";
                String parameter2 = "price";

            List<NameValuePair> params = new ArrayList<NameValuePair>();

                params.add(new BasicNameValuePair("person",parameter1));
                params.add(new BasicNameValuePair("price",parameter2));
                params.add(new BasicNameValuePair("image1",stringba1));
                params.add(new BasicNameValuePair("image2",stringba2));

            JSONObject json = jParser.makeHttpRequest(requiredurl, "POST", params);


            Log.d("Details", json.toString());



                int success = json.getInt("connected");

                if (success == 1) {

                    //blah blah
                      }
        }

Here is the makeHttpRequest() method:

public JSONObject makeHttpRequest(String url, String method,
            List<NameValuePair> params) {

        // Making HTTP request
        try {

            // check for request method
            if(method == "POST"){

                // defaultHttpClient
                DefaultHttpClient httpClient = new DefaultHttpClient();
                HttpPost httpPost = new HttpPost(url);
                httpPost.setEntity(new UrlEncodedFormEntity(params));

                HttpResponse httpResponse = httpClient.execute(httpPost);

                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();

            }       

       ................
       ....................... // Here the result is extracted and made it to json object
       .............................

        // return JSON 
        return jObj;  // returning the json object to the method that calls.

    }

Below is the php code snippet:

$name = $_POST[person];
$price = $_POST[price];
$binary1 = base64_decode($image2);
$binary2 = base64_decode($image2);

$file1 = tempnam($uploadPath, 'image2');
$fp1  = fopen($file1, 'wb');
fwrite($fp1, $binary1);
fclose($fp1);
.................
............................

However I am unable to store images in sever side folder. Even I have seen in some links saying that Base64 is not preferable way while uploading multiple images. Can someone please suggest me how to proceed? Have seen this and many other links, but can't get how to proceed in my requirement as I have to even send some data(like person name, price) along with that images. Any help on this is greatly appreciated.

NOTE: Even if someone can suggest me how to save that above temp file($file1) in the server folder, I would be very thankful.

Upvotes: 2

Views: 1455

Answers (3)

Payal
Payal

Reputation: 913

Here is my code snippet, Hope this helps :

private class AsyncTask1 extends AsyncTask<Void, Void, String>{




    @Override
    protected String doInBackground(Void... params) {

        boolean response = false;

        try {

            ByteArrayOutputStream bos = new ByteArrayOutputStream();
            FileBody bin = new FileBody(new File("temp"));

            File tempImg  = new File("sdcard/signature.jpg");
            if(tempImg.exists())
            {
                checkimgfile=checkimgfile+"LPA"+tempImg;
                bin = new FileBody(tempImg, "image/jpg");
                reqEntity.addPart("txt_sign_lpa", bin);
                reqEntity.addPart("count_lpa",new StringBody("1"));
            }
            else
            {
                reqEntity.addPart("count_lpa",new StringBody("0"));
            }

                FileBody bin1 = new FileBody(new File("temp"));
                File tempImg1  = new File("sdcard/signature2.jpg");
                if(tempImg1.exists())
                {

                    checkimgfile=checkimgfile+"subject"+tempImg1;
                    bin1 = new FileBody(tempImg1, "image/jpg");
                    reqEntity.addPart("txt_sign", bin1);
                    reqEntity.addPart("count_subject",new StringBody("1"));
                }




                reqEntity.addPart("count",new StringBody("0"));


            reqEntity.addPart("name",new StringBody("Shaili"));
            reqEntity.addPart("age",new StringBody("47"));




            try
            {


            ConnectivityManager cm =
            (ConnectivityManager)getBaseContext().getSystemService(Context.CONNECTIVITY_SERVICE);

            NetworkInfo activeNetwork = cm.getActiveNetworkInfo();


            if(activeNetwork!=null && activeNetwork.isAvailable() && activeNetwork.isConnected())
            {
                String xml = "";
                HttpParams httpParameters = new BasicHttpParams();  
                HttpConnectionParams.setConnectionTimeout(httpParameters, 100000);
                HttpConnectionParams.setSoTimeout(httpParameters, 100000);
                final HttpClient httpclient = new DefaultHttpClient(httpParameters);
                final HttpPost httppost = new HttpPost("https://www.xyz.com/abc.php");//url where you want to post your data.
                httppost.setParams(httpParameters);


                httppost.setEntity(reqEntity);
                httppost.addHeader("Accept", "text/html");

                httppost.addHeader("Host", "www.xyz.com");
                httppost.addHeader("User-Agent",
                        "Android ");

                HttpResponse response1 = null;
                String errMessage = "Error";
                try {

                    response1 = httpclient.execute(httppost);
                    final HttpEntity resEntity = response1.getEntity();
                    InputStream content = resEntity.getContent();
                    BufferedReader b = new BufferedReader(new InputStreamReader(
                            content));
                    xml = XmlParser.getTrimmedResponse(b);

                    if (response1 != null){
                        if(Integer.toString(response1.getStatusLine().getStatusCode()).equals("200")){
                            return "success";
                        }
                    }



                } catch (Exception e) {


                    e.printStackTrace();
                    errorstring=errorstring+e.getLocalizedMessage();
                    errMessage = "Network error";

                    return errMessage;
                }

            }
            else if(activeNetwork==null)
            {

                return "Available";
            }

            }
            catch(Exception e)
            {

            Toast.makeText(getBaseContext(), "Network Connection not available", 1).show();
            progressDialog.dismiss();

            }


        } catch (Exception e) {

            errorstring=errorstring+e.getLocalizedMessage();
            return "Network error";

        }
        return "abc";
    }       

    protected void onPostExecute(String result) {


    //do your stuff

    }
}

Upvotes: 1

Dmitry Zaytsev
Dmitry Zaytsev

Reputation: 23962

To send multiple types of data use MultipartEntity (from link provided in your question) instead of URLEncodedEntity. The idea is that MultipartEntity just contains bodies of different types (such as StringBody, FileBody, etc.). So, if you need to send images in Base64, add them as StringBody to the MultipartEntity (which should be setted as entity of your request, using setEntity).

Although, I highly recommend you to save your bitmaps on disk (sd card) and use FileBody instead. It will save you a lot of memory (with Base64 you have to load all images at once) and... what if user will close your app while uploading? You'll lost your bitmaps forever.

P.S. Don't forget to use Service for uploading tasks.

Upvotes: 2

Jason
Jason

Reputation: 1309

Have you considered using FTP instead of your present methodology? There is a library from apache called Apache's commons-net-ftp library to get the job done easily.

Using apache FTP library

Here is a question I asked on stackoverflow long time ago. I was implementing pretty much the same code before but I found FTP method is way easier for uploading files to server.

@TemporaryNickName How to send other data too along with that image. Moreover my image data is in bitmap, not an uri. How to implement it according to my present things?

*There are many tutorials that shows you how to convert bitmap to image file (This is pretty much method of saving file temporary and delete immediately after FTP is done), moreover, when you take a photo using default built in camera app, you image saves automatically. Well sending data should be done separately, in this case, I would write a PHP script with $_POST to receive data than save it into database or write it into XML*


To save uploaded file, use

move_uploaded_file($src, $path);

move uploaded file doc

Upvotes: 2

Related Questions