ErenRavenHeart
ErenRavenHeart

Reputation: 281

Sending Image/Text file from Android to Webserver (localhost)

I'm very new to Android Programming, and my task is to send an image and text data to a web server (localhost), I've tried a lot of code to do the job however

all of them wont work. My app just crashes whenever I try to execute the code, so I decided to debug the code and see whats the problem. then I found out that

whenever a MultipartEntity is found, the code just crashes.. I dont really know Why..

The Code goes like this

Log.v(TAG, "(1)");
HttpClient httpClient;
HttpPost postRequest;
Log.v(TAG, "(2)" + picturePath);
MultipartEntity reqEntity;
ResponseHandler<String> responseHandler;
Log.v(TAG, "(3)");
File file;
FileBody fileBody;
Log.v(TAG, "(4)");
httpClient = new DefaultHttpClient();
postRequest = new HttpPost("http://192.168.5.132/mysite/test.php");
responseHandler = new BasicResponseHandler();
Log.v(TAG, "(5)");
    // Indicate that this information comes in parts (text and file)
reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
Log.v(TAG, "(6)");
file = new File(picturePath);
fileBody = new FileBody(file, "images/jpeg");
reqEntity.addPart("fileupload", fileBody);
Log.v(TAG, "(7)");
try {
      reqEntity.addPart("username", new StringBody("un"));
      reqEntity.addPart("password", new StringBody("pw"));

      postRequest.setEntity(reqEntity);
      httpClient.execute(postRequest, responseHandler);
    }
catch (UnsupportedEncodingException e) {
      e.printStackTrace();
}
catch (ClientProtocolException e) {
      e.printStackTrace();
}
catch (IOException e) {
      e.printStackTrace();
}

I have include Logs to the code to see where the code stops during execution. here is the log cat output!

08-27 12:22:47.153: V/(10358): (1)

08-27 12:22:47.153: V/(10358): (2)/storage/sdcard0/Pictures/boarding_pass.bmp

08-27 12:22:47.153: V/(10358): (3)

08-27 12:22:47.153: V/(10358): (4)

08-27 12:22:47.153: V/(10358): (5)

08-27 12:22:47.153: D/AndroidRuntime(10358): Shutting down VM

08-27 12:22:47.153: W/dalvikvm(10358): threadid=1: thread exiting with uncaught exception 
(group=0x417da2a0)

08-27 12:22:47.163: E/AndroidRuntime(10358): FATAL EXCEPTION: main

08-27 12:22:47.163: E/AndroidRuntime(10358): java.lang.IllegalStateException: Could not execute 
method of the activity


08-27 12:22:47.163: E/AndroidRuntime(10358):    at android.view.View$1.onClick(View.java:3614)

08-27 12:22:47.163: E/AndroidRuntime(10358):    at android.view.View.performClick(View.java:4107)

08-27 12:22:47.163: E/AndroidRuntime(10358):    at 
android.view.View$PerformClick.run(View.java:17056)

08-27 12:22:47.163: E/AndroidRuntime(10358):    at android.os.Handler.handleCallback(Handler.java:615)

08-27 12:22:47.163: E/AndroidRuntime(10358):    at android.os.Handler.dispatchMessage(Handler.java:92)

08-27 12:22:47.163: E/AndroidRuntime(10358):    at android.os.Looper.loop(Looper.java:137)

08-27 12:22:47.163: E/AndroidRuntime(10358):    at 
android.app.ActivityThread.main(ActivityThread.java:4830)

08-27 12:22:47.163: E/AndroidRuntime(10358):    at java.lang.reflect.Method.invokeNative(Native Method)

08-27 12:22:47.163: E/AndroidRuntime(10358):    at java.lang.reflect.Method.invoke(Method.java:511)

08-27 12:22:47.163: E/AndroidRuntime(10358):    at 
com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)

08-27 12:22:47.163: E/AndroidRuntime(10358):    at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)

08-27 12:22:47.163: E/AndroidRuntime(10358):    at dalvik.system.NativeStart.main(Native Method)

08-27 12:22:47.163: E/AndroidRuntime(10358): Caused by: java.lang.reflect.InvocationTargetException

08-27 12:22:47.163: E/AndroidRuntime(10358):    at java.lang.reflect.Method.invokeNative(Native 
Method)
......

Your help is really needed.. thank you so much..

Upvotes: 3

Views: 12021

Answers (4)

Sudhakar
Sudhakar

Reputation: 57

You can upload the file from android to server using volley.

Check here.

Android Volley File Upload

Upvotes: 0

Mugunthan S
Mugunthan S

Reputation: 538

try this code 100% working . the image uploading done through multi-part data passing

<RelativeLayout xmlns:android="http://schemas.android.com/apk/res/android"
    xmlns:tools="http://schemas.android.com/tools"
    android:id="@+id/container"
    android:layout_width="match_parent"
    android:layout_height="match_parent"
    tools:context="com.example.fileupload.MainActivity"
    tools:ignore="MergeRootFrame" >

    <ImageView
        android:id="@+id/imageView_pic"
        android:layout_width="100dp"
        android:layout_height="150dp"
        android:layout_alignParentTop="true"
        android:layout_centerHorizontal="true"
        android:src="@drawable/abc_ab_bottom_solid_light_holo" />

    <Button
        android:id="@+id/button_selectpic"
        android:layout_width="250dp"
        android:layout_height="50dp"
        android:layout_below="@+id/imageView_pic"
        android:layout_centerHorizontal="true"
        android:layout_marginTop="18dp"
        android:text="Browse" />

    <Button
        android:id="@+id/uploadButton"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/button_selectpic"
        android:layout_alignRight="@+id/button_selectpic"
        android:layout_below="@+id/button_selectpic"
        android:text="upload" />

    <TextView
        android:id="@+id/messageText"
        android:layout_width="wrap_content"
        android:layout_height="wrap_content"
        android:layout_alignLeft="@+id/uploadButton"
        android:layout_alignRight="@+id/uploadButton"
        android:layout_below="@+id/uploadButton"
        android:layout_marginTop="38dp"
        android:text=""
        android:textAppearance="?android:attr/textAppearanceMedium" />

</RelativeLayout>

Android code

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;

import android.app.Activity;
import android.app.ProgressDialog;
import android.content.Intent;
import android.database.Cursor;
import android.graphics.Bitmap;
import android.graphics.BitmapFactory;
import android.net.Uri;
import android.os.Bundle;
import android.provider.MediaStore;
import android.util.Log;
import android.view.View;
import android.view.View.OnClickListener;
import android.widget.Button;
import android.widget.ImageView;
import android.widget.TextView;
import android.widget.Toast;

public class MainActivity extends Activity implements OnClickListener{

    private TextView messageText;
    private Button uploadButton, btnselectpic;
    private ImageView imageview;
    private int serverResponseCode = 0;
    private ProgressDialog dialog = null;

    private String upLoadServerUri = null;
    private String imagepath=null;
    @Override
    public void onCreate(Bundle savedInstanceState) {

        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_main);

        uploadButton = (Button)findViewById(R.id.uploadButton);
        messageText  = (TextView)findViewById(R.id.messageText);
        btnselectpic = (Button)findViewById(R.id.button_selectpic);
        imageview = (ImageView)findViewById(R.id.imageView_pic);

        btnselectpic.setOnClickListener(this);
        uploadButton.setOnClickListener(this);
        upLoadServerUri = "http://192.168.2.4/fileupload/upljson.php";
    }


    @Override
    public void onClick(View arg0) {
        if(arg0==btnselectpic)
        {
            Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent, "Complete action using"), 1);
        }
        else if (arg0==uploadButton) {

             dialog = ProgressDialog.show(MainActivity.this, "", "Uploading file...", true);
             messageText.setText("uploading started.....");
             new Thread(new Runnable() {
                 public void run() {

                      uploadFile(imagepath);

                 }
               }).start();     
        }

    } 

    @Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {

        if (requestCode == 1 && resultCode == RESULT_OK) {
            //Bitmap photo = (Bitmap) data.getData().getPath(); 

            Uri selectedImageUri = data.getData();
            imagepath = getPath(selectedImageUri);
            Bitmap bitmap=BitmapFactory.decodeFile(imagepath);
            imageview.setImageBitmap(bitmap);
            messageText.setText("Uploading file path:" +imagepath);

        }
    }
         public String getPath(Uri uri) {
                String[] projection = { MediaStore.Images.Media.DATA };
                Cursor cursor = managedQuery(uri, projection, null, null, null);
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                return cursor.getString(column_index);
            }

    public int uploadFile(String sourceFileUri) {


          String fileName = sourceFileUri;

          HttpURLConnection conn = null;
          DataOutputStream dos = null;  
          String lineEnd = "\r\n";
          String twoHyphens = "--";
          String boundary = "*****";
          int bytesRead, bytesAvailable, bufferSize;
          byte[] buffer;
          int maxBufferSize = 1 * 1024 * 1024; 
          File sourceFile = new File(sourceFileUri); 

          if (!sourceFile.isFile()) {

               dialog.dismiss(); 

               Log.e("uploadFile", "Source File not exist :"+imagepath);

               runOnUiThread(new Runnable() {
                   public void run() {
                       messageText.setText("Source File not exist :"+ imagepath);
                   }
               }); 

               return 0;

          }
          else
          {
               try { 

                     // open a URL connection to the Servlet
                   FileInputStream fileInputStream = new FileInputStream(sourceFile);
                   URL url = new URL(upLoadServerUri);

                   // Open a HTTP  connection to  the URL
                   conn = (HttpURLConnection) url.openConnection(); 
                   conn.setDoInput(true); // Allow Inputs
                   conn.setDoOutput(true); // Allow Outputs
                   conn.setUseCaches(false); // Don't use a Cached Copy
                   conn.setRequestMethod("POST");
                   conn.setRequestProperty("Connection", "Keep-Alive");
                   conn.setRequestProperty("ENCTYPE", "multipart/form-data");
                   conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
                   conn.setRequestProperty("file", fileName); 

                   dos = new DataOutputStream(conn.getOutputStream());

                   dos.writeBytes(twoHyphens + boundary + lineEnd); 
                   dos.writeBytes("Content-Disposition: form-data; name=\"file\";filename=\""
                                             + fileName + "\"" + lineEnd);

                   dos.writeBytes(lineEnd);

                   // create a buffer of  maximum size
                   bytesAvailable = fileInputStream.available(); 

                   bufferSize = Math.min(bytesAvailable, maxBufferSize);
                   buffer = new byte[bufferSize];

                   // read file and write it into form...
                   bytesRead = fileInputStream.read(buffer, 0, bufferSize);  

                   while (bytesRead > 0) {

                     dos.write(buffer, 0, bufferSize);
                     bytesAvailable = fileInputStream.available();
                     bufferSize = Math.min(bytesAvailable, maxBufferSize);
                     bytesRead = fileInputStream.read(buffer, 0, bufferSize);   

                    }

                   // send multipart form data necesssary after file data...
                   dos.writeBytes(lineEnd);
                   dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

                   // Responses from the server (code and message)
                   serverResponseCode = conn.getResponseCode();
                   String serverResponseMessage = conn.getResponseMessage();

                   Log.i("uploadFile", "HTTP Response is : "
                           + serverResponseMessage + ": " + serverResponseCode);

                   if(serverResponseCode == 200){

                       runOnUiThread(new Runnable() {
                            public void run() {
                                String msg = "File Upload Completed.\n\n See uploaded file here : \n\n"
                                      +" C:/xamp/wamp/fileupload/uploads";
                                messageText.setText(msg);
                                Toast.makeText(MainActivity.this, "File Upload Complete.", Toast.LENGTH_SHORT).show();
                            }
                        });                
                   }    

                   //close the streams //
                   fileInputStream.close();
                   dos.flush();
                   dos.close();

              } catch (MalformedURLException ex) {

                  dialog.dismiss();  
                  ex.printStackTrace();

                  runOnUiThread(new Runnable() {
                      public void run() {
                          messageText.setText("MalformedURLException Exception : check script url.");
                          Toast.makeText(MainActivity.this, "MalformedURLException", Toast.LENGTH_SHORT).show();
                      }
                  });

                  Log.e("Upload file to server", "error: " + ex.getMessage(), ex);  
              } catch (Exception e) {

                  dialog.dismiss();  
                  e.printStackTrace();

                  runOnUiThread(new Runnable() {
                      public void run() {
                          messageText.setText("Got Exception : see logcat ");
                          Toast.makeText(MainActivity.this, "Got Exception : see logcat ", Toast.LENGTH_SHORT).show();
                      }
                  });
                  Log.e("Upload file to server Exception", "Exception : "  + e.getMessage(), e);  
              }
              dialog.dismiss();       
              return serverResponseCode; 

           } // End else block 
         }


}

php server code

<?php
 $response = array();
if (empty($_FILES) || $_FILES['file']['error']) {
 $response["code"] = 2;
        $response["message"] = "failed to move uploaded file";
        echo json_encode($response);
 }

$chunk = isset($_REQUEST["chunk"]) ? intval($_REQUEST["chunk"]) : 0;
$chunks = isset($_REQUEST["chunks"]) ? intval($_REQUEST["chunks"]) : 0;

$fileName = isset($_REQUEST["name"]) ? $_REQUEST["name"] : $_FILES["file"]["name"];
$filePath = "uploads/$fileName";


// Open temp file
$out = @fopen("{$filePath}.part", $chunk == 0 ? "wb" : "ab");

if ($out) {
  // Read binary input stream and append it to temp file
  $in = @fopen($_FILES['file']['tmp_name'], "rb");

  if ($in) {
    while ($buff = fread($in, 4096))
          fwrite($out, $buff);

  } else

 $response["code"] = 2;
 $response["message"] = "Oops!  Failed to open input Stream error occurred.";
 echo json_encode($response);
  @fclose($in);

  @fclose($out);

  @unlink($_FILES['file']['tmp_name']);
} else

   $response["code"] = 2;
        $response["message"] = "Oops! Failed to open output error occurred.";
        echo json_encode($response);


// Check if file has been uploaded
if (!$chunks || $chunk == $chunks - 1) {
  // Strip the temp .part suffix off
  rename("{$filePath}.part", $filePath);
}
  $response["code"] = 2;
        $response["message"] = "successfully uploaded";
        echo json_encode($response);

?>

the above code 100% working . if you want multi-part entity passing ,try this code on your program necessary place and also code add the $_post method e.g($name=$_POST['username'];)on your php server

entity.addPart("user_id", new StringBody(user_id));
            Log.d("userid",user_id);
            entity.addPart("username", new StringBody(username));
            entity.addPart("password", new StringBody(password));
            entity.addPart("filetype",new StringBody("jpeg"));
            // entity.addPart("photo", new
            // StringBody("/storage/sdcard0/Download/1.jpg"));
            httpPost.setEntity(entity);

            Log.d("URL Request: ", url.toString());

            HttpResponse httpResponse = httpClient.execute(httpPost);
            int code = httpResponse.getStatusLine().getStatusCode(); 

pass the required value to this function and add $_post["username"],$_post["password"] on php

public JSONObject getJSONFromUrl(String url, String username,
            String password,  String photo_path) {
InputStream is = null;
    JSONObject jObj = null;
    static String jsonResp = "";
    String CONTENT_TYPE_JSON = "application/json";
    static String json = "";
    Context context;

        try {
            File file = null;
            HttpClient httpClient = new DefaultHttpClient();
            HttpPost httpPost = new HttpPost(url);
            MultipartEntity entity = new MultipartEntity(
                    HttpMultipartMode.BROWSER_COMPATIBLE);

            if(photo_path != null)
                file = new File(photo_path);

            //temp end
            entity.addPart("username", new StringBody(username));
            entity.addPart("password", new StringBody(password));

            entity.addPart("file", new FileBody(file));
            entity.addPart("filetype",new StringBody("jpeg"));
            // entity.addPart("photo", new
            // StringBody("/storage/sdcard0/Download/1.jpg"));
            httpPost.setEntity(entity);

            Log.d("URL Request: ", url.toString());

            HttpResponse httpResponse = httpClient.execute(httpPost);
            int code = httpResponse.getStatusLine().getStatusCode();

            if (code != 200) {
                Log.d("HTTP response code is:", Integer.toString(code));
                return null;
            } else {
                HttpEntity httpEntity = httpResponse.getEntity();
                is = httpEntity.getContent();
            }
        } catch (ConnectTimeoutException e) {
            // TODO: handle exception

            Log.e("Timeout Exception", e.toString());
            return null;
        } catch (SocketTimeoutException e) {
            // TODO: handle exception
            Log.e("Socket Time out", e.toString());
            return null;
        } catch (UnsupportedEncodingException e) {
            e.printStackTrace();
            return null;
        } catch (ClientProtocolException e) {
            e.printStackTrace();
            return null;
        } catch (IOException e) {
            e.printStackTrace();
            return null;
        }

        try {

            BufferedReader reader = new BufferedReader(new InputStreamReader(
                    is, "iso-8859-1"), 8);
            StringBuilder sb = new StringBuilder();
            String line = null;
            while ((line = reader.readLine()) != null) {
                sb.append(line + "\n");
            }
            is.close();
            jsonResp = sb.toString();

            Log.d("Content: ", sb.toString());

        } catch (Exception e) {
            Log.e("Buffer Error", "Error converting Response " + e.toString());
            return null;
        }

        // try parse the string to a JSON object
        try {
            jObj = new JSONObject(jsonResp);

        } catch (JSONException e) {
            Log.e("JSON Parser", "Error parsing data " + e.toString());
        }

        // return JSON Object
        return jObj;
    }

Upvotes: 6

Lavekush
Lavekush

Reputation: 6166

Device/Emulator itself a Machine which is having thier own localhost loop.

As you've learned, when you use the emulator, localhost (127.0.0.1) refers to the device's own loop back service, not the one on your machine as you may expect.

Therefore whenever your giving locahost/127.0.0.x that's meant its trying to search your service on your device environment, so it will become fail. because your web-service project are not available on device/emulator loop.

So can use 10.0.2.2 to access your actual machine, it is an alias set up to help in development.

Network Address Space Look into this. http://developer.android.com/tools/devices/emulator.html#networkaddresses

Upvotes: 1

Anirudh Sharma
Anirudh Sharma

Reputation: 7974

try this,it may help you and is.it's done using AsyncHttpClient library,get the jar file and attach it in your project then use following code to upload any file-

RequestParams params=new RequestParams();

String file = getImagePath().toString();//get path of file you want to upload
        File myfile_one=new  File(file);
try {
    params.put("image1", myfile_one);//image 1 is the key(it uses key-value pair)        
} catch (FileNotFoundException e) {
    // TODO Auto-generated catch block
    e.printStackTrace();
}


AsyncHttpClient client=new AsyncHttpClient();
    client.post(Constant.url_two, params,new AsyncHttpResponseHandler(){
//here implement the methods of library and write rest of your code
}

you can find other methods to connect to server in the this link.Try it,its really simple

Upvotes: 0

Related Questions