Uploading Image from android to PHP server

48,505

Use below code. It will do the same.

public class UploadImage extends Activity {
    InputStream inputStream;
        @Override
    public void onCreate(Bundle icicle) {
            super.onCreate(icicle);
            setContentView(R.layout.main);

            Bitmap bitmap = BitmapFactory.decodeResource(getResources(),R.drawable.icon);           ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); //compress to which format you want.
            byte [] byte_arr = stream.toByteArray();
            String image_str = Base64.encodeBytes(byte_arr);
            ArrayList<NameValuePair> nameValuePairs = new  ArrayList<NameValuePair>();

            nameValuePairs.add(new BasicNameValuePair("image",image_str));

             Thread t = new Thread(new Runnable() {

            @Override
            public void run() {
                  try{
                         HttpClient httpclient = new DefaultHttpClient();
                         HttpPost httppost = new HttpPost("server-link/folder-name/upload_image.php");
                         httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
                         HttpResponse response = httpclient.execute(httppost);
                         String the_string_response = convertResponseToString(response);
                         runOnUiThread(new Runnable() {

                                @Override
                                public void run() {
                                    Toast.makeText(UploadImage.this, "Response " + the_string_response, Toast.LENGTH_LONG).show();                          
                                }
                            });

                     }catch(Exception e){
                          runOnUiThread(new Runnable() {

                            @Override
                            public void run() {
                                Toast.makeText(UploadImage.this, "ERROR " + e.getMessage(), Toast.LENGTH_LONG).show();                              
                            }
                        });
                           System.out.println("Error in http connection "+e.toString());
                     }  
            }
        });
         t.start();
        }

        public String convertResponseToString(HttpResponse response) throws IllegalStateException, IOException{

             String res = "";
             StringBuffer buffer = new StringBuffer();
             inputStream = response.getEntity().getContent();
             int contentLength = (int) response.getEntity().getContentLength(); //getting content length…..
              runOnUiThread(new Runnable() {

            @Override
            public void run() {
                Toast.makeText(UploadImage.this, "contentLength : " + contentLength, Toast.LENGTH_LONG).show();                     
            }
        });

             if (contentLength < 0){
             }
             else{
                    byte[] data = new byte[512];
                    int len = 0;
                    try
                    {
                        while (-1 != (len = inputStream.read(data)) )
                        {
                            buffer.append(new String(data, 0, len)); //converting to string and appending  to stringbuffer…..
                        }
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                    try
                    {
                        inputStream.close(); // closing the stream…..
                    }
                    catch (IOException e)
                    {
                        e.printStackTrace();
                    }
                    res = buffer.toString();     // converting stringbuffer to string…..

                    runOnUiThread(new Runnable() {

                    @Override
                    public void run() {
                       Toast.makeText(UploadImage.this, "Result : " + res, Toast.LENGTH_LONG).show();
                    }
                });
                    //System.out.println("Response => " +  EntityUtils.toString(response.getEntity()));
             }
             return res;
        }
}

PHP Code

<?php
    $base=$_REQUEST['image'];
     $binary=base64_decode($base);
    header('Content-Type: bitmap; charset=utf-8');
    $file = fopen('uploaded_image.jpg', 'wb');
    fwrite($file, $binary);
    fclose($file);
    echo 'Image upload complete!!, Please check your php file directory……';
?>

UPDATE

NameValuePair and Http Classes are deprecated so, I've tried this code and it's working for me. Hope that helps!

private void uploadImage(Bitmap imageBitmap){
    ByteArrayOutputStream stream = new ByteArrayOutputStream();
    imageBitmap.compress(Bitmap.CompressFormat.PNG, 90, stream);
    byte[] b = stream.toByteArray();
    String encodedImage = Base64.encodeToString(b, Base64.DEFAULT);
    ArrayList<Pair<String, String>> params = new ArrayList<Pair<String, String>>();
    params.add(new Pair<>("image", encodedImage));

    try {
        new AsyncUploader().execute(my_upload_php, getQuery(params));
    } catch (UnsupportedEncodingException e) {
        e.printStackTrace();
    }
}

private String getQuery(List<Pair<String, String>> params) throws UnsupportedEncodingException{
    StringBuilder result = new StringBuilder();
    boolean first = true;

    for(Pair<String, String> pair : params){
        if(first)
            first = false;
        else
            result.append("&");

        result.append(URLEncoder.encode(pair.first, "UTF-8"));
        result.append("=");
        result.append(URLEncoder.encode(pair.second, "UTF-8"));
    }
    return result.toString();
}

private class AsyncUploader extends AsyncTask<String, Integer, String>
{
    @Override
    protected String doInBackground(String... strings) {
        String urlString = strings[0];
        String params = strings[1];
        URL url = null;
        InputStream stream = null;
        HttpURLConnection urlConnection = null;
        try {
            url = new URL(urlString);
            urlConnection = (HttpURLConnection) url.openConnection();
            urlConnection.setRequestMethod("POST");
            urlConnection.setDoOutput(true);

            urlConnection.connect();

            OutputStreamWriter wr = new OutputStreamWriter(urlConnection.getOutputStream());
            wr.write(params);
            wr.flush();

            stream = urlConnection.getInputStream();
            BufferedReader reader = new BufferedReader(new InputStreamReader(stream, "UTF-8"), 8);
            String result = reader.readLine();
            return result;
        }catch (IOException ioe){
            ioe.printStackTrace();
        } finally {
            if (urlConnection != null)
                urlConnection.disconnect();
        }
        return null;
    }

    @Override
    protected  void onPostExecute(String result) {
        Toast.makeText(MakePhoto.this, result, Toast.LENGTH_SHORT).show();
    }
}
Share:
48,505
Chirag Ghori
Author by

Chirag Ghori

Android Developer

Updated on August 12, 2022

Comments

  • Chirag Ghori
    Chirag Ghori almost 2 years

    In my app i am uploading an image from my device to a local web server... after executing the code a .jpg file gets created in the server but it does not gets opened. And the size of the file in server is different from the original file.

    Android activity:--

    public class MainActivity extends Activity {
    
    
    private static int RESULT_LOAD_IMAGE = 1;
    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);
    
        Button btnSelectImage=(Button) findViewById(R.id.uploadButton);
        btnSelectImage.setOnClickListener(new OnClickListener() {
    
            @Override
            public void onClick(View v) {
    
            Intent i=new   Intent(Intent.ACTION_PICK,android.provider.MediaStore.Images.Media.EXTERNAL_CONTENT_URI);
    
            startActivityForResult(i, RESULT_LOAD_IMAGE);
    
            }
        });
    
    }
    
    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        super.onActivityResult(requestCode, resultCode, data);
    
        if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && data!=null) {
    
            Uri selectedImage=data.getData();
            String[] filePathColumn={MediaStore.Images.Media.DATA};
    
            Cursor cursor = getContentResolver().query(selectedImage,filePathColumn, null, null, null);
            cursor.moveToFirst();
    
            int columnIndex = cursor.getColumnIndex(filePathColumn[0]);
            String picturePath = cursor.getString(columnIndex);
            cursor.close();
    
    
            Bitmap bitmap=BitmapFactory.decodeFile(picturePath);
    
            ImageView im = (ImageView) findViewById(R.id.imgBox);
            im.setImageBitmap(bitmap);
    
            /*
             * Convert the image to a string
             * */
            ByteArrayOutputStream stream = new ByteArrayOutputStream();
            bitmap.compress(Bitmap.CompressFormat.PNG, 90, stream); //compress to which format you want.
            byte [] byte_arr = stream.toByteArray();
            String image_str = Base64.encodeToString(byte_arr,Base64.DEFAULT);
    
            /*
             * Create a name value pair for the image string to be passed to the server
             * */
            ArrayList<NameValuePair> nameValuePairs = new  ArrayList<NameValuePair>();            
            nameValuePairs.add(new BasicNameValuePair("image",image_str));
    
    
            JSONObject jsonString=new JSONObject();
            try {
                jsonString.put("img", image_str);
            } catch (JSONException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
            new uploadImageToPhp().execute(jsonString);
    
    
    
        }
    
    
    }
    @Override
    public boolean onCreateOptionsMenu(Menu menu) {
        // Inflate the menu; this adds items to the action bar if it is present.
        getMenuInflater().inflate(R.menu.main, menu);
    
    
        return true;
    }
    public class uploadImageToPhp extends AsyncTask<JSONObject, Void, Void>
    {
        String dataToSend=null;
    
        public static final String prefix="http://";                                                        //prefix of the urls
        public static final String server_ip="172.16.26.155";                                                   //the ip address where the php server is located    
    
        public static final String completeServerAddress=prefix+server_ip+"/test_upload/upload_image.php";                  //Exact location of the php files
    
        @Override
        protected Void doInBackground(JSONObject... params) {
    
            dataToSend="image="+params[0];
            communicator(completeServerAddress, dataToSend);
    
    
    
    
            return null;
        }
    
        public void communicator(String urlString,String dataToSend2)
        {
            String result=null;
    
            try
            {
                URL url=new URL(urlString);
                URLConnection conn=url.openConnection();
    
                HttpURLConnection httpConn=(HttpURLConnection) conn;
                httpConn.setRequestProperty("Accept", "application/json");
                httpConn.setRequestProperty("accept-charset", "UTF-8");
                httpConn.setRequestMethod("POST");         
                httpConn.connect();
    
                //Create an output stream to send data to the server
                OutputStreamWriter out=new OutputStreamWriter(httpConn.getOutputStream());
                out.write(dataToSend2);
                out.flush();
    
                int httpStatus = httpConn.getResponseCode();            
                System.out.println("Http status :"+httpStatus);
    
                if(httpStatus==HttpURLConnection.HTTP_OK)
                {
                    Log.d("HTTP STatus", "http connection successful");
    
                    BufferedReader in = new BufferedReader(new InputStreamReader(httpConn.getInputStream(),"UTF-8"));
                    StringBuilder sb = new StringBuilder();
                    String inputLine;
                    while ((inputLine = in.readLine()) != null)
                    {
                        System.out.println(inputLine);
                        sb.append(inputLine+"\n");
                    }
                    in.close();
                    result=sb.toString();                       
    
                    try
                    {
    
                        //jsonResult = new JSONObject(result);
                    }
                    catch(Exception e)
                    {
                         Log.e("JSON Parser", "Error parsing data " + e.toString());
                    }
    
    
                }
                else
                {
                    System.out.println("Somthing went wrong");
                }
            } catch (MalformedURLException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            } catch (IOException e) {
                // TODO Auto-generated catch block
                e.printStackTrace();
            }
    
    
        }
    
    
    }
    
    }
    

    PHP code:-

     $recievedJson=$_REQUEST['image'];
    $imageContent=json_decode($recievedJson,true);
     $base=$imageContent["img"];
    
     $binary=base64_decode($base);
    
     echo $binary;
    header('Content-Type: bitmap; charset=utf-8');
    $file = fopen('uploaded_image.jpg', 'wb');
    fwrite($file, $binary);
    fclose($file);
    
  • Admin
    Admin over 10 years
    I am using httpurlconnection for all other communication , so I was thinking to use the same for uploading the images ,
  • InnocentKiller
    InnocentKiller over 10 years
    But this is more easiest way to upload image and this code is perfectly working for me.
  • edwinj
    edwinj over 8 years
    httpClient is depreciated now so this answer is kind of useless unless you do stuff to get httplclient the other way ;)
  • Zar E Ahmer
    Zar E Ahmer about 8 years
    BaseNameValuePair is deprecated. Update a new method.
  • Petro
    Petro about 8 years
    String ba1= Base64.encodeToString(imagearray1, Base64.DEFAULT);
  • Tanner Summers
    Tanner Summers almost 8 years
    which methods are outdated?
  • Tanner Summers
    Tanner Summers almost 8 years
    why use BasicNameValuePair over hashmap?