Search code examples
phpandroidimage-uploading

Uploading Image from android to PHP server


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);

Solution

  • 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();
        }
    }