Sending pictures to a web server

I have to build an application that should send pictures from the phone to a web server. Unfortunately, I really don't know how to do this. Could someone help me out please?


Use web service to achieve this task.

In order to use web service in android,please visit this links.

  1. kSoap2 library used for calling web service from android device.
  2. Calling simple web service in android.
  3. Calling web service & uploading file through HttpClient
  4. Web Service That Returns An Array of Objects With KSOAP - For complex objects.
  5. Accessing a JAX-WS web service from Android
  6. How-to: Android as a RESTful Client

Here's the code I'm using to upload images to a remote server, using raw sockets. Pros of raw socket over httpclient is that you can display an upload progress bar.

Disclaimer : most of this code mostly comes from stackoverflow.

/**
 * Asynchronous task to upload file to server
 */
class UploadImageTask extends AsyncTask<File, Integer, Boolean> {

    /** Upload file to this url */
    private static final String UPLOAD_URL = "http://thibault-laptop:8080/report";

    /** Send the file with this form name */
    private static final String FIELD_FILE = "file";
    private static final String FIELD_LATITUDE = "latitude";
    private static final String FIELD_LONGITUDE = "longitude";

    /**
     * Prepare activity before upload
     */
    @Override
    protected void onPreExecute() {
        super.onPreExecute();
        setProgressBarIndeterminateVisibility(true);
        mConfirm.setEnabled(false);
        mCancel.setEnabled(false);
        showDialog(UPLOAD_PROGRESS_DIALOG);
    }

    /**
     * Clean app state after upload is completed
     */
    @Override
    protected void onPostExecute(Boolean result) {
        super.onPostExecute(result);
        setProgressBarIndeterminateVisibility(false);
        mConfirm.setEnabled(true);
        mDialog.dismiss();

        if (result) {
            showDialog(UPLOAD_SUCCESS_DIALOG);
        } else {
            showDialog(UPLOAD_ERROR_DIALOG);
        }
    }

    @Override
    protected Boolean doInBackground(File... image) {
        return doFileUpload(image[0], UPLOAD_URL);
    }

    @Override
    protected void onProgressUpdate(Integer... values) {
        super.onProgressUpdate(values);

        if (values[0] == 0) {
            mDialog.setTitle(getString(R.string.progress_dialog_title_uploading));
        }

        mDialog.setProgress(values[0]);
    }

    /**
     * Upload given file to given url, using raw socket
     * @see http://stackoverflow.com/questions/4966910/androidhow-to-upload-mp3-file-to-http-server
     *
     * @param file The file to upload
     * @param uploadUrl The uri the file is to be uploaded
     *
     * @return boolean true is the upload succeeded
     */
    private boolean doFileUpload(File file, String uploadUrl) {
        HttpURLConnection conn = null;
        DataOutputStream dos = null;
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        String separator = twoHyphens + boundary + lineEnd;
        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1 * 1024 * 1024;
        int sentBytes = 0;
        long fileSize = file.length();

        // The definitive url is of the kind:
        // http://host/report/latitude,longitude
        uploadUrl += "/" + mLocation.getLatitude() + "," + mLocation.getLongitude();

        // Send request
        try {
            // Configure connection
            URL url = new URL(uploadUrl);
            conn = (HttpURLConnection) url.openConnection();
            conn.setDoInput(true);
            conn.setDoOutput(true);
            conn.setUseCaches(false);
            conn.setRequestMethod("PUT");
            conn.setRequestProperty("Connection", "Keep-Alive");
            conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);
            publishProgress(0);

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

            // Send location params
            writeFormField(dos, separator, FIELD_LATITUDE, "" + mLocation.getLatitude());
            writeFormField(dos, separator, FIELD_LONGITUDE, "" + mLocation.getLongitude());

            // Send multipart headers
            dos.writeBytes(twoHyphens + boundary + lineEnd);
            dos.writeBytes("Content-Disposition: form-data; name=\"" + FIELD_FILE + "\";filename=\""
                    + file.getName() + "\"" + lineEnd);
            dos.writeBytes(lineEnd);

            // Read file and create buffer
            FileInputStream fileInputStream = new FileInputStream(file);
            bytesAvailable = fileInputStream.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];

            // Send file data
            bytesRead = fileInputStream.read(buffer, 0, bufferSize);
            while (bytesRead > 0) {
                // Write buffer to socket
                dos.write(buffer, 0, bufferSize);

                // Update progress dialog
                sentBytes += bufferSize;
                publishProgress((int)(sentBytes * 100 / fileSize));

                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);
            dos.flush();
            dos.close();
            fileInputStream.close();
        } catch (IOException ioe) {
            Log.e(TAG, "Cannot upload file: " + ioe.getMessage(), ioe);
            return false;
        }

        // Read response
        try {
            int responseCode = conn.getResponseCode();
            return responseCode == 200;
        } catch (IOException ioex) {
            Log.e(TAG, "Upload file failed: " + ioex.getMessage(), ioex);
            return false;
        } catch (Exception e) {
            Log.e(TAG, "Upload file failed: " + e.getMessage(), e);
            return false;
        }
    }

    private void writeFormField(DataOutputStream dos, String separator, String fieldName, String fieldValue) throws IOException
    {
        dos.writeBytes(separator);
        dos.writeBytes("Content-Disposition: form-data; name=\"" + fieldName + "\"\r\n");
        dos.writeBytes("\r\n");
        dos.writeBytes(fieldValue);
        dos.writeBytes("\r\n");
    }
}

To start upload, use the following command :

new UploadImageTask().execute(new File(imagePath));