2014-01-23 135 views
0

我試圖從SD卡的特定文件夾上傳音頻文件到服務器。但是當我試圖做到這一點,我得到以下錯誤。如何將音頻從SD卡上傳到服務器中android

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

和我的全是logcat中如下。

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 

和一個更logcat的下面,這是

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) 

我的代碼

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

它沒有找到文件路徑,所以返回空值! – Saqib

+0

http://stackoverflow.com/questions/9953483/access-sd-card-in-android-for-uploading-a-file-to-my-php-server-using-phonegap可能這會幫助你,我認爲 – unitedartinc

+0

@ mrfarts,該代碼使用phonegap我沒有使用過。但謝謝你的回覆。 – InnocentKiller

回答

2

日誌信息是明確的,你想上傳一個目錄,而不是一個文件:

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

/AudioRecorder /不是音頻文件。您應該在末尾附加音頻文件名。

如果您必須上傳目錄中的所有文件,請考慮在(Intent)服務中執行此操作。

  1. 作爲參數添加的文件名,你的方法:
  2. 在您的活動,循環到文件列表,併爲每個文件:

    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. 的服務:

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

    希望它有幫助

PS:未測試代碼。

+0

是的,但我想上傳AudioRecorder文件夾內的所有文件,所以我如何實現這一點。 – InnocentKiller

+0

我不知道如何做到這一點。如果有,請發佈任何代碼片段或示例。這將從你身邊得到很大的幫助。 – InnocentKiller

+0

okey,使用IntentService類按順序上傳文件。 – kylexy1357

相關問題