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();
}
}
Comments
-
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 over 10 yearsI am using httpurlconnection for all other communication , so I was thinking to use the same for uploading the images ,
-
InnocentKiller over 10 yearsBut this is more easiest way to upload image and this code is perfectly working for me.
-
edwinj over 8 yearshttpClient is depreciated now so this answer is kind of useless unless you do stuff to get httplclient the other way ;)
-
Zar E Ahmer about 8 yearsBaseNameValuePair is deprecated. Update a new method.
-
Petro about 8 years
String ba1= Base64.encodeToString(imagearray1, Base64.DEFAULT);
-
Tanner Summers almost 8 yearswhich methods are outdated?
-
Tanner Summers almost 8 yearswhy use BasicNameValuePair over hashmap?