user4050065
user4050065

Reputation:

How to upload image from gallery to server?

I am following this example, it is working fine but when I am trying to upload image but its not uploading and showing source file not exists..Can any one help me what is mistake in my code ? Thanks in advance

public class UploadToServer extends Activity {
 private static final int SELECT_PICTURE = 1;
 private String selectedImagePath;
TextView messageText;
Button uploadButton;
int serverResponseCode = 0;
ProgressDialog dialog = null;
String upLoadServerUri = null;
final String uploadFilePath =  Environment.getExternalStorageDirectory().getPath();
//final String uploadFileName = "";
private Button buttonLoadImage;
private ImageView img;
@Override
public void onCreate(Bundle savedInstanceState) {

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

    img = (ImageView)findViewById(R.id.imgView);

    buttonLoadImage = (Button) findViewById(R.id.buttonLoadPicture);
    buttonLoadImage.setOnClickListener(new View.OnClickListener() {

        @Override
        public void onClick(View arg0) {

             Intent intent = new Intent();
             intent.setType("image/*");
             intent.setAction(Intent.ACTION_GET_CONTENT);
             startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);
        }
    });
    uploadButton = (Button)findViewById(R.id.uploadButton);
    messageText  = (TextView)findViewById(R.id.messageText);

    messageText.setText(uploadFilePath+selectedImagePath);

    /************* Php script path ****************/
    upLoadServerUri = "http://www.androidexample.com/media/UploadToServer.php";

    uploadButton.setOnClickListener(new OnClickListener() {            
        @Override
        public void onClick(View v) {

            dialog = ProgressDialog.show(UploadToServer.this, "", "Uploading file...", true);

            new Thread(new Runnable() {
                    public void run() {
                         runOnUiThread(new Runnable() {
                                public void run() {
                                    messageText.setText("uploading started.....");
                                }
                            });                      

                         uploadFile(uploadFilePath + "" + selectedImagePath);

                    }
                  }).start();        
            }
        });
}


@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    if (resultCode == RESULT_OK) {
        if (requestCode == SELECT_PICTURE) {
            Uri selectedImageUri = data.getData();
            selectedImagePath = getPath(selectedImageUri);
            System.out.println("Image Path : " + selectedImagePath);
            img.setImageURI(selectedImageUri);
        }
    }
}


@SuppressWarnings("deprecation")
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 :"
                               +uploadFilePath + "" + selectedImagePath);

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

           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("uploaded_file", fileName); 

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

               dos.writeBytes(twoHyphens + boundary + lineEnd); 
               dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_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"
                                          +" http://www.androidexample.com/media/uploads/"
                                          +selectedImagePath;

                            messageText.setText(msg);
                            Toast.makeText(UploadToServer.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(UploadToServer.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(UploadToServer.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 
     } 
  }

How can I fix that?

Upvotes: 1

Views: 7080

Answers (5)

Venkat
Venkat

Reputation: 1

    public void selectImage() {
    final CharSequence[] items = {"Take Photo", "Choose from Library",
            "Cancel"};
    AlertDialog.Builder builder = new AlertDialog.Builder(ProfileViewerActivity.this);
    builder.setTitle("Add Photo!");
    builder.setItems(items, new DialogInterface.OnClickListener() {
        @Override
        public void onClick(DialogInterface dialog, int item) {
            if (items[item].equals("Take Photo")) {

                boolean resul = Utilty.checkPermissionsForCamera(permissions,ProfileViewerActivity.this);
                //    printLogMessage(" checkPermissionforcamera "+resul);

                userChoosenTask = "Take Photo";
                if (resul)
                    cameraIntent();
            } else if (items[item].equals("Choose from Library")) {

                boolean result = Utilty.checkPermission(ProfileViewerActivity.this);
                userChoosenTask = "Choose from Library";
                if ( result)
                    galleryIntent();
            } else if (items[item].equals("Cancel")) {
                userChoosenTask="Cancel";
                dialog.dismiss();
            }
        }
    });
    builder.show();


}



private void cameraIntent() {
    Intent intent = new Intent(MediaStore.ACTION_IMAGE_CAPTURE);
    startActivityForResult(intent, REQUEST_CAMERA);
}

private void galleryIntent() {
    if(Build.VERSION.SDK_INT <19){
        Intent intent = new Intent();
        intent.setType("image/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        //  startActivityForResult(Intent.createChooser(intent, "Select File"),SELECT_FILE);
        startActivityForResult(Intent.createChooser(intent, "Select Picture"), SELECT_FILE);
    }else
    {
        Intent intent = new Intent(Intent.ACTION_OPEN_DOCUMENT);
        intent.addCategory(Intent.CATEGORY_OPENABLE);
        intent.setType("image/*");
        startActivityForResult(intent,SELECT_FILE);
    }
}

@Override
public void onRequestPermissionsResult(int requestCode, String[] permissions, int[] grantResults) {
    printLogMessage("grantResults "+grantResults.length);
    printLogMessage("permissions "+permissions.length);
    switch(requestCode) {
        case Utilty.MY_PERMISSIONS_CAMERA:
            if (grantResults.length==2 && grantResults[0] == PackageManager.PERMISSION_GRANTED && grantResults[1] == PackageManager.PERMISSION_GRANTED ) {
                if (userChoosenTask.equals("Take Photo")){
                    cameraIntent();
                }}
            if (grantResults.length==1 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (userChoosenTask.equals("Take Photo")){
                    cameraIntent();
                }}
            break;
        case Utilty.MY_PERMISSIONS_REQUEST_READ_EXTERNAL_STORAGE:
            if (grantResults.length>0 && grantResults[0] == PackageManager.PERMISSION_GRANTED) {
                if (userChoosenTask.equals("Choose from Library"))
                    galleryIntent();
            }
            break;
    }
}

@Override
public void onActivityResult(int requestCode, int resultCode, Intent data) {
    super.onActivityResult(requestCode, resultCode, data);
    try{
        if (resultCode == Activity.RESULT_OK) {
            if (requestCode == SELECT_FILE)
                onSelectFromGalleryResult(data);
            else if (requestCode == REQUEST_CAMERA)
                onCaptureImageResult(data);
        }
    }catch (Exception e){
        e.printStackTrace();
        Toast.makeText(ProfileViewerActivity.this,"File path is empty",Toast.LENGTH_SHORT).show();
    }
}

private void onCaptureImageResult(Intent data) {
    bitmap = (Bitmap) data.getExtras().get("data");
    bitmap=getResizedBitmap(bitmap,200,200);
    ByteArrayOutputStream bytes = new ByteArrayOutputStream();
    bitmap.compress(Bitmap.CompressFormat.JPEG, 90, bytes);
    File destination = new File(Environment.getExternalStorageDirectory(),
            System.currentTimeMillis() + ".jpg");
    FileOutputStream fo;
    try {
        destination.createNewFile();
        fo = new FileOutputStream(destination);
        fo.write(bytes.toByteArray());
        fo.close();
    } catch (FileNotFoundException e) {
        e.printStackTrace();
    } catch (IOException e) {
        e.printStackTrace();
    }
    printLogMessage(" capture imageresult onCaptureImageResult "+destination.getAbsolutePath());
    selectedFilePath=destination.getAbsolutePath();
    multiPartPrfImageFile=new File(selectedFilePath);
    imageView.setImageBitmap(bitmap);
    dynamicToolbarColor(bitmap);
}

private void onSelectFromGalleryResult(Intent data) {
    Uri uri=data.getData();
    String image= ImagePath.getPath(ProfileViewerActivity.this,uri);
    printLogMessage("image path gallery"+image);
    bitmap= null;
    if (data != null) {
        try {
            bitmap = MediaStore.Images.Media.getBitmap(ProfileViewerActivity.this.getApplicationContext().getContentResolver(), data.getData());
        } catch (IOException e) {
            e.printStackTrace();
        }
    }
    selectedFilePath=image;
    multiPartPrfImageFile=new File(selectedFilePath);
    imageView.setImageBitmap(bitmap);
    dynamicToolbarColor(bitmap);
}

private void printLogMessage(String Message) {
    Log.e("Profile", Message);
}

public static Bitmap getResizedBitmap(Bitmap image, int newHeight, int newWidth) {
    int width = image.getWidth();
    int height = image.getHeight();
    float scaleWidth = ((float) newWidth) / width;
    float scaleHeight = ((float) newHeight) / height;
    // create a matrix for the manipulation
    Matrix matrix = new Matrix();
    // resize the bit map
    matrix.postScale(scaleWidth, scaleHeight);
    // recreate the new Bitmap
    Bitmap resizedBitmap = Bitmap.createBitmap(image, 0, 0, width, height,
            matrix, false);
    return resizedBitmap;
}

Upvotes: 0

user4050065
user4050065

Reputation:

public class UploadToServer extends Activity {


 private static final int SELECT_PICTURE = 1;  
 private String selectedImagePath="";  
 TextView messageText;  
 Button uploadButton;  
 int serverResponseCode = 0;  
 ProgressDialog dialog = null;  

 String upLoadServerUri = null;  

  /**********  File Path *************/  
 final String uploadFilePath =  Environment.getExternalStorageDirectory().getPath();    
 //final String uploadFileName = "";  
  private Button buttonLoadImage;  
  private ImageView img;  
 //private static int RESULT_LOAD_IMAGE = 1;  

 @Override
 public void onCreate(Bundle savedInstanceState) {

   super.onCreate(savedInstanceState);
   setContentView(R.layout.activity_upload_to_server);
  // int a=getIntent().getIntExtra("image", RESULT_LOAD_IMAGE);

   img = (ImageView)findViewById(R.id.imgView);

   buttonLoadImage = (Button) findViewById(R.id.buttonLoadPicture);
   buttonLoadImage.setOnClickListener(new View.OnClickListener() {

       @Override
       public void onClick(View arg0) {

         Intent intent = new Intent();
            intent.setType("image/*");
            intent.setAction(Intent.ACTION_GET_CONTENT);
            startActivityForResult(Intent.createChooser(intent,"Select Picture"), SELECT_PICTURE);
       }
   });
   uploadButton = (Button)findViewById(R.id.uploadButton);
   messageText  = (TextView)findViewById(R.id.messageText);



   /************* Php script path ****************/
upLoadServerUri = "http://www.androidexample.com/media/UploadToServer.php";

    uploadButton.setOnClickListener(new OnClickListener() {            
       @Override
       public void onClick(View v) {

           dialog = ProgressDialog.show(UploadToServer.this, "", "Uploading file...", true);

           new Thread(new Runnable() {
                   public void run() {
                        runOnUiThread(new Runnable() {
                               public void run() {
                                messageText.setText("uploading started.....");
                               }
                           });                      
                     //use only selectedImagePath. because it contains whole path. no need to add /mnt/sdcard....
                        uploadFile(selectedImagePath);

                   }
                 }).start();        
           }
       });
  }


 @Override
 public void onActivityResult(int requestCode, int resultCode, Intent data) {
   if (resultCode == RESULT_OK) {
       if (requestCode == SELECT_PICTURE) {
           Uri selectedImageUri = data.getData();
           selectedImagePath = getPath(selectedImageUri);

           //Print imagepath in textview here
           messageText.setText(selectedImagePath);

           System.out.println("Image Path : " + selectedImagePath);
           img.setImageURI(selectedImageUri);
       }
   }
 }


 @SuppressWarnings("deprecation")
  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(); 
           //use only selectedImagePath. because it contains whole path. no need to add /mnt/sdcard....
           Log.e("uploadFile", "Source File not exist :"
                               + selectedImagePath);

           //use only selectedImagePath. because it contains whole path. no need to add /mnt/sdcard....
           runOnUiThread(new Runnable() {
               public void run() {
                   messageText.setText("Source File not exist :"
                           + selectedImagePath);
               }
           }); 

           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("uploaded_file", fileName); 

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

               dos.writeBytes(twoHyphens + boundary + lineEnd); 
               dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_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"
                                          +" http://www.androidexample.com/media/uploads/"
                                          +selectedImagePath;

                            messageText.setText(msg);
                            Toast.makeText(UploadToServer.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(UploadToServer.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(UploadToServer.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 
    } 
 }

Upvotes: 0

YFeizi
YFeizi

Reputation: 1528

use this code in your onActiviyresualt :

if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK && null != data){
            Uri uri = resultIntent.getData();
            if (uri == null) {
                return;
            }
            File file = new File(getRealPathFromURI(uri));
            final Handler handler = new Handler();
            MediaScannerConnection.scanFile(
                    this, new String[]{file.toString()}, null,
                    new MediaScannerConnection.OnScanCompletedListener() {
                        public void onScanCompleted(String path, final Uri uri) {

                            handler.post(new Runnable() {
                                @Override
                                public void run() {
                                ImageView imageView = (ImageView) findViewById(R.id.imgView);
                                 imageView.setImageBitmap(BitmapFactory.decodeFile(uri))
                                }
                            });
                        }
                    });
        }

i hope it can help you

Upvotes: 0

balaji koduri
balaji koduri

Reputation: 1321

dont hard code the file location, use like this:

String uploadFilePath=Environment.getExternalStorageDirectory().getAbsolutePath()+"/windows/PublicPictures/SamplePictures/";

try to check the file is exist or not like this:

            File file = new File(picturePath);
            if(file.exists()){
                //write your uploading functionality here.
            }else{
                //file not found please select another file.
            }

in your on activity result method change like this:

@Override
    protected void onActivityResult(int requestCode, int resultCode, Intent data) {
        // TODO Auto-generated method stub
        if (requestCode == RESULT_LOAD_IMAGE && resultCode == RESULT_OK
                && null != data) {
            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();

            File file = new File(picturePath);
            if (file.exists()) {
                uploadFileName=picturePath;
            }

            ImageView imageView = (ImageView) findViewById(R.id.imgView);
            imageView.setImageBitmap(BitmapFactory.decodeFile(picturePath));
        }
    }

and this also:

uploadButton.setOnClickListener(new OnClickListener() {
            @Override
            public void onClick(View v) {

                dialog = ProgressDialog.show(UploadToServer.this, "",
                        "Uploading file...", true);

                new Thread(new Runnable() {
                    public void run() {
                        runOnUiThread(new Runnable() {
                            public void run() {
                                messageText.setText("uploading started.....");
                            }
                        });

                        uploadFile(uploadFileName);
                    }
                }).start();
            }
        });

Upvotes: 2

ajitksharma
ajitksharma

Reputation: 2019

Try uploading with this simple java code, you can add other stuffs like you using in your code say progress bar and other alerts. Considering your file path is correct, I would like to suggest uploading image code something like this:

    String url = "http://www.androidexample.com/media/UploadToServer.php";
    String fileName = "/storage/sdcard/windows/PublicPictures/SamplePictures/service_lifecycle.png"; 
    //file to be uploaded
    HttpClient httpclient = new DefaultHttpClient();
    HttpPost httppost = new HttpPost(url);
    FileBody fileContent = new FiSystem.out.println("hello");
    StringBody comment = new StringBody("Filename: " + fileName);
    MultipartEntity reqEntity = new MultipartEntity();
    reqEntity.addPart("file", fileContent);
    httppost.setEntity(reqEntity);

    HttpResponse response = httpclient.execute(httppost);
    HttpEntity resEntity = response.getEntity();

To check file path you can check printing something like file.length() and comparing it with size of original image.

Hope this helps you with your problem....!!!!!

Upvotes: 0

Related Questions