Uploading audio, video or image files from Android to server

Hello everyone,

Check out the popular posts from Coderzheaven.com

Uploading and Downloading of files – Popular and Useful posts from CoderzHeaven

In one of the previous posts I have shown one method to upload an image in android.
Here is another method to upload a media file like images,audio or video in android.
Here is the main java file that does the upload.
Here I am trying to open audio from the gallery. However you can change it to image or video according to your need.
The code for upload will not change since we change only the code for opening the gallery. We use only the path of the selected file whether it is image or video or audio to upload.

These are for downloading files from the server.

1. How to Download an image in ANDROID programatically?
2. How to download a file to your android device from a remote server with a custom progressbar showing progress?

package pack.coderzheaven;

import java.io.DataInputStream;
import java.io.DataOutputStream;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
import java.net.HttpURLConnection;
import java.net.MalformedURLException;
import java.net.URL;
import java.util.HashMap;
import android.app.Activity;
import android.content.Intent;
import android.database.Cursor;
import android.net.Uri;
import android.os.Bundle;
import android.os.Environment;
import android.provider.MediaStore;
import android.util.Log;

public class UploadAudioDemo extends Activity {

	private static final int SELECT_AUDIO = 2;
	String selectedPath = "";

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);

        openGalleryAudio();
    }

    public void openGalleryAudio(){

   	Intent intent = new Intent();
        intent.setType("audio/*");
        intent.setAction(Intent.ACTION_GET_CONTENT);
        startActivityForResult(Intent.createChooser(intent,"Select Audio "), SELECT_AUDIO);
   }

    public void onActivityResult(int requestCode, int resultCode, Intent data) {

	    if (resultCode == RESULT_OK) {

	        if (requestCode == SELECT_AUDIO)
	        {
	        	System.out.println("SELECT_AUDIO");
	            Uri selectedImageUri = data.getData();
	            selectedPath = getPath(selectedImageUri);
	         	System.out.println("SELECT_AUDIO Path : " + selectedPath);
	         	doFileUpload();
	        }

	    }
	}

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

    private void doFileUpload(){
        HttpURLConnection conn = null;
        DataOutputStream dos = null;
        DataInputStream inStream = null;
        String lineEnd = "rn";
        String twoHyphens = "--";
        String boundary =  "*****";
        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1*1024*1024;
        String responseFromServer = "";
        String urlString = "http://your_website.com/upload_audio_test/upload_audio.php";
        try
        {
         //------------------ CLIENT REQUEST
        FileInputStream fileInputStream = new FileInputStream(new File(selectedPath) );
         // open a URL connection to the Servlet
         URL url = new URL(urlString);
         // Open a HTTP connection to the URL
         conn = (HttpURLConnection) url.openConnection();
         // Allow Inputs
         conn.setDoInput(true);
         // Allow Outputs
         conn.setDoOutput(true);
         // Don't use a cached copy.
         conn.setUseCaches(false);
         // Use a post method.
         conn.setRequestMethod("POST");
         conn.setRequestProperty("Connection", "Keep-Alive");
         conn.setRequestProperty("Content-Type", "multipart/form-data;boundary="+boundary);
         dos = new DataOutputStream( conn.getOutputStream() );
         dos.writeBytes(twoHyphens + boundary + lineEnd);
         dos.writeBytes("Content-Disposition: form-data; name="uploadedfile";filename="" + selectedPath + """ + 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);
         // close streams
         Log.e("Debug","File is written");
         fileInputStream.close();
         dos.flush();
         dos.close();
        }
        catch (MalformedURLException ex)
        {
             Log.e("Debug", "error: " + ex.getMessage(), ex);
        }
        catch (IOException ioe)
        {
             Log.e("Debug", "error: " + ioe.getMessage(), ioe);
        }
        //------------------ read the SERVER RESPONSE
        try {
              inStream = new DataInputStream ( conn.getInputStream() );
              String str;

              while (( str = inStream.readLine()) != null)
              {
                   Log.e("Debug","Server Response "+str);
              }
              inStream.close();

        }
        catch (IOException ioex){
             Log.e("Debug", "error: " + ioex.getMessage(), ioex);
        }
      }
}

Now the server side , the code is written in Php.

<?php
// Where the file is going to be placed
$target_path = "uploads/";

/* Add the original filename to our target path.
Result is "uploads/filename.extension" */
$target_path = $target_path . basename( $_FILES['uploadedfile']['name']);

if(move_uploaded_file($_FILES['uploadedfile']['tmp_name'], $target_path)) {
    echo "The file ".  basename( $_FILES['uploadedfile']['name']).
    " has been uploaded";
} else{
    echo "There was an error uploading the file, please try again!";
    echo "filename: " .  basename( $_FILES['uploadedfile']['name']);
    echo "target_path: " .$target_path;
}
?>

Things to keep in mind
1. Make sure your server is running.
2. Your server file path should be right.
3. Check your folder write permission in the server.

Please leave your valuable comments.
Enjoy.

53 thoughts on “Uploading audio, video or image files from Android to server

  1. Pingback: How to Upload Multiple files in one request along with other string parameters in android? | Coderz Heaven

  2. Ali

    Hi Thanks for this tutorial..
    Can you tell me how to store images in the emulator database and retrieve images from the database on to the emulator..
    example: doctor list with their images on the emulator..
    Waiting for your reply…

    Reply
    1. James Post author

      Its not good to store images in the database. instead copy it into a folder in your Sdcard or application sandbox and save the path of that file in your database.
      For example if you have a number of images, copy it to drawable folder and store their names in the database and load it using that name. if you are downloading the images then download it to your application sandbox or sdcard and then load it from there.

      Reply
  3. Simon

    Its good thanks but when i m trying to upload a file having size more than 100KB it fails, without showing any error after some time it jumps to another file for uploading. Can you suggest me for this …

    Reply
  4. shehan

    Hey I tried my best to compile this code. but it gives many more errors. So can you please send me a link to download a course code to this function as soon as possible.

    Thanks and Best Regards,
    Shehan.

    Reply
  5. Baskoro

    Hi thanks for your tutorial,it’s awesome
    i try it in windows and it’s work
    but when i try in linux it’s doesn’t work
    what should i do??if trouble with folder permission i am not sure because i have modified the permission
    please help me..thank you :)

    Reply
  6. Malaiselvan

    Hi, Thanks for this valuable post. It helps me a lot. I have 2 doubts before implementing this solution in my app.

    1. Will this program supports uploading files greater than 10MB
    2. My PHP webserver is hosted on a shared hosting server where the PHP upload limit is defined as 2 MB. In this case will this program upload files greater than 10MB?

    Reply
      1. Malaiselvan

        I dont understand what do you mean by “if Your server allows it”. Do you mean the PHP.INI variable “post_max_size”

        Reply
  7. Deepak

    I checked out your code. I have a doubt.. Is this code allows user to send a very large file ie., greater than 20 MB.. Bcoz i tried many ways, i can upload 5MB of file sucessfully but wen i try to upload 20MB iam getting “OUT OF MEMORY” Exception.. Plz help

    Reply
  8. Sundar

    Hi,thanks for the nice post.But i have a doubt in this.After the file was written to the server it takes more than to two minutes to get the response from the server.So i want to know that does the reading of response depends upon the device internet speed?

    Reply
      1. Sundar

        Iam using 3G connection to upload file to the server.Will exception rise does the 3G connection disabled while uploading the video?

        Reply
  9. Pingback: Uploading and Downloading of files - Popular and Useful posts.

  10. venkat

    hi thanks for nice post.
    i want to send some more parameters with the video.
    how to add that parameters to this code.
    like name,about the video etc can send to the service how to add parameter to this code?

    Reply
  11. Dhaval

    I am gettng “There was an error uploading the file, please try again!” all the times. also i am not getting the name of my file from the server. Help me out.

    Reply
    1. James Post author

      hey Dhaval, please check your internet connection, server path and the file name variables. Also add the internet permission in the Android Manifest file.

      Reply
      1. Dhaval

        I got it. The “\” were missing in the code above, the line:
        String lineEnd = “rn”;
        should be String line End = “\r\n”;
        actually.

        Also the line “dos.writeBytes(“Content-Disposition…”
        had same issue. Placed “\”s and all set.

        Thanks for you reply

        Reply
  12. mike

    Hi,
    can you help me with this. the code is correct yet i can’t upload the file. it was force close. “the application has stopped unexpectedly.please try again later. what should be the solution for this?

    Reply
  13. terli

    i got error in php file i tried to generate service in server it shows as follows( i am new to php please help me….. thank you)

    Warning: fopen(uploaded_image.jpg) [function.fopen]: failed to open stream: Permission denied in /home/inspirei/public_html/bramara/upload/img.php on line 5

    Warning: fclose(): supplied argument is not a valid stream resource in /home/inspirei/public_html/bramara/upload/img.php on line 7
    Image upload complete!!, Please check your php file directory……
    ¦

    Reply
    1. James Post author

      Check your permissions in the PHP Server directory. You should set a write permission for the image to be uploaded in the server.

      Reply
  14. mawmawlagi

    thx for code..but i have error like this..
    Notice: Undefined index: uploads in C:\xampp\htdocs\upload_test\upload_media_test.php on line 5

    what’s wrong?? please help me..thx

    Reply
  15. vikrant

    dos.writeBytes(“Content-Disposition: form-data; name=”uploadedfile”;filename=”" + selectedPath + “”" + lineEnd);
    dos.writeBytes(lineEnd);

    getting error on this lines plz help me out

    Reply
    1. Rishabh

      To resolve syntax error in Vikrant post

      dos.writeBytes(“Content-Disposition: form-data; name=\”uploaded_file\”;filename=\”"+ selectedPath + “\”" + lineEnd);

      Reply
  16. Rishabh

    dos.writeBytes(“Content-Disposition: form-data; name=”uploadedfile”;filename=”” + selectedPath + “”” + lineEnd);
    dos.writeBytes(lineEnd);

    getting error on this lines plz help me out

    Error : Syntax error on Tokens, delete this tokens

    Reply
    1. Geet

      Use:

      dos.writeBytes(“Content-Disposition: form-data; name=’uploaded_file’;filename=’”
      + fileName + “‘” + lineEnd);

      Reply
      1. David

        I’ve used the next line to try and handle the code error –

        dos.writeBytes(“Content-Disposition: form-data; name=’uploaded_file’;filename=’”+ fileName + “‘” + lineEnd);

        But now only – fileName – is being an error – anyone knows why is that?

        Reply
        1. James Post author

          There is a “semicolon” in between your code in param “writeBytes”…
          remove that…

          Reply
  17. android

    09-28 03:46:14.554: E/Debug(10081): Server Response
    09-28 03:46:14.584: E/Debug(10081): Server Response Notice: Undefined index: uploadedfile in C:\xampp\htdocs\android\audio.php on line 5
    09-28 03:46:14.594: E/Debug(10081): Server Response
    09-28 03:46:14.604: E/Debug(10081): Server Response Notice: Undefined index: uploadedfile in C:\xampp\htdocs\android\audio.php on line 10
    09-28 03:46:14.604: E/Debug(10081): Server Response
    09-28 03:46:14.604: E/Debug(10081): Server Response Notice: Undefined index: uploadedfile in C:\xampp\htdocs\android\audio.php on line 12
    09-28 03:46:14.604: E/Debug(10081): Server Response There was an error uploading the file, please try again!
    09-28 03:46:14.614: E/Debug(10081): Server Response Notice: Undefined index: uploadedfile in C:\xampp\htdocs\android\audio.php on line 17
    09-28 03:46:14.614: E/Debug(10081): Server Response filename: target_path: uploads/

    Reply
  18. Mugdha Kaushik

    Add this line before loop otherwise zero kb data is uploaded on server.
    // Read file
    bytesRead = fileInputStream.read(buffer, 0, bufferSize);

    while (bytesRead > 0)
    {
    System.out.println(“Inside while loop”);
    outputStream.write(buffer, 0, bufferSize);
    bytesAvailable = fileInputStream.available();
    bufferSize = Math.min(bytesAvailable, maxBufferSize);
    bytesRead = fileInputStream.read(buffer, 0, bufferSize);
    }

    Thanks

    Reply
  19. Sam

    Hi very nice post. But this code failed when uploading file size greater than 20MB i.e it throws exception OutOfMemory. How do I increase the buffer size? or any other way to resolve this.

    thanks

    Reply
  20. seema

    should we follow these ” How to create a new Virtual SD card in emulator in ANDROID? How to start emulator with the created SDCard?” and “How to add files like images inside your emulator in ANDROID?” tutorials to open the emulator? thanks

    Reply
  21. Balint

    I always get 03-15 19:48:59.414: E/Debug(32243): Server Response There was an error uploading the file, please try again!filename: target_path: Upload/
    Why? When I am running your code, filename is known but it looks like it is not forwarded with the code

    Reply
  22. Ketul

    Hi I have tried your code for client and server both, and I am getting below response

    Server Response There was an error uploading the file, please try again!filename: target_path: upload/

    Please help me out ..how to solve this and what is the issue ?

    Reply
  23. Valkesh patel

    Hy, I want to upload large file About 50MB, but I was got error of out of memory.
    I convert video file in to bytearray then is getting error.

    I upload video like this. record video and then convert in bytearry for encode base64 and getting string value from encoding file and post data in to our server.
    please have a solution of that issue then help me. Thank you in advance.

    Reply

Leave a Reply

Your email address will not be published. Required fields are marked *

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>