InnocentKiller
InnocentKiller

Reputation: 5234

How to Upload audio from sd-card to server in android

I am trying to upload audio file from particular folder of SD-Card to server. but when i try to do that i am getting following error.

error: /mnt/sdcard/AudioRecorder: open failed: EISDIR (Is a directory)

and my full logcat is as below.

01-23 12:44:18.920: E/Debug(6164): error: /mnt/sdcard/AudioRecorder: open failed: EISDIR (Is a directory)
01-23 12:44:18.920: E/Debug(6164): java.io.FileNotFoundException: /mnt/sdcard/AudioRecorder: open failed: EISDIR (Is a directory)
01-23 12:44:18.920: E/Debug(6164):  at libcore.io.IoBridge.open(IoBridge.java:448)
01-23 12:44:18.920: E/Debug(6164):  at java.io.FileInputStream.<init>(FileInputStream.java:78)
01-23 12:44:18.920: E/Debug(6164):  at iqualtech.skirr.Record_AudioPG.doAudioFileUpload(Record_AudioPG.java:295)
01-23 12:44:18.920: E/Debug(6164):  at iqualtech.skirr.Record_AudioPG.stopRecording(Record_AudioPG.java:271)
01-23 12:44:18.920: E/Debug(6164):  at iqualtech.skirr.Record_AudioPG.access$0(Record_AudioPG.java:265)
01-23 12:44:18.920: E/Debug(6164):  at iqualtech.skirr.Record_AudioPG$4.onClick(Record_AudioPG.java:124)
01-23 12:44:18.920: E/Debug(6164):  at android.view.View.performClick(View.java:3517)
01-23 12:44:18.920: E/Debug(6164):  at android.view.View$PerformClick.run(View.java:14155)
01-23 12:44:18.920: E/Debug(6164):  at android.os.Handler.handleCallback(Handler.java:605)
01-23 12:44:18.920: E/Debug(6164):  at android.os.Handler.dispatchMessage(Handler.java:92)
01-23 12:44:18.920: E/Debug(6164):  at android.os.Looper.loop(Looper.java:154)
01-23 12:44:18.920: E/Debug(6164):  at android.app.ActivityThread.main(ActivityThread.java:4624)
01-23 12:44:18.920: E/Debug(6164):  at java.lang.reflect.Method.invokeNative(Native Method)
01-23 12:44:18.920: E/Debug(6164):  at java.lang.reflect.Method.invoke(Method.java:511)
01-23 12:44:18.920: E/Debug(6164):  at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
01-23 12:44:18.920: E/Debug(6164):  at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
01-23 12:44:18.920: E/Debug(6164):  at dalvik.system.NativeStart.main(Native Method)
01-23 12:44:18.920: E/Debug(6164): Caused by: libcore.io.ErrnoException: open failed: EISDIR (Is a directory)
01-23 12:44:18.920: E/Debug(6164):  at libcore.io.IoBridge.open(IoBridge.java:437)
01-23 12:44:18.920: E/Debug(6164):  ... 16 more

and one more logcat below this is

01-23 12:44:18.926: E/AndroidRuntime(6164): FATAL EXCEPTION: main
01-23 12:44:18.926: E/AndroidRuntime(6164): java.lang.NullPointerException
01-23 12:44:18.926: E/AndroidRuntime(6164):     at iqualtech.skirr.Record_AudioPG.doAudioFileUpload(Record_AudioPG.java:344)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at iqualtech.skirr.Record_AudioPG.stopRecording(Record_AudioPG.java:271)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at iqualtech.skirr.Record_AudioPG.access$0(Record_AudioPG.java:265)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at iqualtech.skirr.Record_AudioPG$4.onClick(Record_AudioPG.java:124)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at android.view.View.performClick(View.java:3517)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at android.view.View$PerformClick.run(View.java:14155)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at android.os.Handler.handleCallback(Handler.java:605)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at android.os.Handler.dispatchMessage(Handler.java:92)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at android.os.Looper.loop(Looper.java:154)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at android.app.ActivityThread.main(ActivityThread.java:4624)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at java.lang.reflect.Method.invokeNative(Native Method)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at java.lang.reflect.Method.invoke(Method.java:511)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:809)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:576)
01-23 12:44:18.926: E/AndroidRuntime(6164):     at dalvik.system.NativeStart.main(Native Method)

My Code

private void doAudioFileUpload() {
        HttpURLConnection conn = null;
        DataOutputStream dos = null;
        DataInputStream inStream = null;
        String existingFileName = Environment.getExternalStorageDirectory()
                .getPath() + "/AudioRecorder/";

        System.out.println("Inside of doupload nd path is === "
                + existingFileName);

        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1 * 1024 * 1024 * 1024;
        String urlString = "http://link to server/folder-name/upload_audio.php";
        try {
            // ------------------ CLIENT REQUEST
            FileInputStream fileInputStream = new FileInputStream(new File(
                    existingFileName));
            // 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=\""
                    + existingFileName + "\"" + 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);
        }
    }    

Upvotes: 1

Views: 1138

Answers (1)

bashizip
bashizip

Reputation: 581

The log message is clear, you are trying to upload a directory, not a file :

String existingFileName = Environment.getExternalStorageDirectory()
                .getPath() + "/AudioRecorder/"

/AudioRecorder/ is not an audio file.You should perhaps append the audio filename at the end.

If you have to upload all the files in the dir, then think about doing that inside an (Intent)service.

  1. Add the filename as parameter to your method :
  2. In your activity, Loop into the files list, and for each file :

    for(String filename : filesList ){
    
                    Intent intent = new Intent(this, UploadIntentService.class);
                    Bundle params = new Bundle();
                    params.putString(UploadIntentService.KEY_FILE_NAME, filename);
                    activity.startService(intent);
    }
    
  3. The Service :

    public class UploadIntentService extends IntentService {
    
    public static final String KEY_FILE_NAME= "filename";
    public UploadIntentService() {
        super("UploadIntentService");
                }
    
    @Override
    protected void onHandleIntent(Intent intent) { 
    String filename = intent.getBundle().getStringExtra(UploadIntentService.KEY_FILE_NAME);      
    
    doAudioFileUpload(filename);
           }
    
       private void doAudioFileUpload(String filename) {
        HttpURLConnection conn = null;
        DataOutputStream dos = null;
        DataInputStream inStream = null;
        String existingFileName = Environment.getExternalStorageDirectory()
                .getPath() + "/AudioRecorder/"+filename;
    
        System.out.println("Inside of doupload nd path is === "
                + existingFileName);
    
        String lineEnd = "\r\n";
        String twoHyphens = "--";
        String boundary = "*****";
        int bytesRead, bytesAvailable, bufferSize;
        byte[] buffer;
        int maxBufferSize = 1 * 1024 * 1024 * 1024;
        String urlString = "http://link to server/folder-name/upload_audio.php";
        try {
            // ------------------ CLIENT REQUEST
            FileInputStream fileInputStream = new FileInputStream(new File(
                    existingFileName));
            // 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=\""
                    + existingFileName + "\"" + 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);
        }
    }   
    

    Hope it helps

PS: Not tested code.

Upvotes: 2

Related Questions