2013-04-08 63 views
4

我在我的代碼中的問題,但我不知道它在哪裏對E日誌報告EPIPE(破管)上傳時?

04-08 05:47:46.745: E/Upload Server(20080): Starting : /storage/sdcard1/Music/Piano (my favourites)/11 Tchaikovsky - The Music Lovers.mp3 
04-08 05:47:47.136: E/Upload Server(20080): Connection Error : sendto failed: EPIPE (Broken pipe) 

是什麼(EPIPE)? ,當我試圖上傳圖像時,它的上傳成功,但任何其他文件E貓報告(破管)爲什麼!

這是我上傳的代碼

@Override 
    protected String doInBackground(String... urls) { 


    String upLoadServerUri = "http://test.com/test.php"; 
    String fileName = this.file_path; 
    HttpURLConnection connection = null; 
    DataOutputStream outputStream = null; 
    String lineEnd = "\r\n"; 
    String twoHyphens = "--"; 
    String boundary = "*****"; 
    int bytesRead, bytesAvailable, bufferSize; 
    byte[] buffer; 
    int maxBufferSize = 1*1024*1024; 
    File sourceFile = new File(fileName); 
    int sentBytes = 0; 
    long fileSize = sourceFile.length(); 
    connection = null; 


    try 
    { 


    FileInputStream fileInputStream = new FileInputStream(sourceFile); 

    Log.e("Upload Server ", "Starting : "+ fileName); 

    URL url = new URL(upLoadServerUri); 
    connection = (HttpURLConnection) url.openConnection(); 


    connection.setDoInput(true); 
    connection.setDoOutput(true); 
    connection.setUseCaches(false); 
    connection.setChunkedStreamingMode(1024); 
    connection.setRequestMethod("POST"); 
    connection.setRequestProperty("Connection", "Keep-Alive"); 
    connection.setRequestProperty("Content-Type","multipart/form-data;boundary="+boundary); 
    outputStream = new DataOutputStream(connection.getOutputStream()); 
    outputStream.writeBytes(twoHyphens + boundary + lineEnd); 
    outputStream.writeBytes("Content-Disposition: form-data; name=\"file[]\";filename=\""+ fileName + "\"" + lineEnd); 

     outputStream.writeBytes(lineEnd); 
     bytesAvailable = fileInputStream.available(); 
     bufferSize = Math.min(bytesAvailable, maxBufferSize); 
     buffer = new byte[bufferSize]; 



bytesRead = fileInputStream.read(buffer, 0, bufferSize); 

    while (bytesRead > 0) 
    { 

    if(isCancelled()){ 

    break; 
    } 

    sentBytes += bytesRead; 

    double percentDone = (sentBytes * 1.0)/fileSize * 100; 
    publishProgress((int)percentDone); 

    outputStream.write(buffer, 0, bufferSize); 

    bytesAvailable = fileInputStream.available(); 

    bufferSize = Math.min(bytesAvailable,  maxBufferSize); 
    bytesRead = fileInputStream.read(buffer, 0,  bufferSize); 
    } 

    if(isCancelled()){ 

    fileInputStream.close(); 
    outputStream.flush(); 
    outputStream.close(); 
    Log.e("Upload Server ", "upload Canceled "); 
    return "canceled"; 
    } 

    outputStream.writeBytes(lineEnd); 
    outputStream.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd); 
    int serverResponseCode  = connection.getResponseCode(); 
    fileInputStream.close(); 
    outputStream.flush(); 
    outputStream.close(); 

    if(serverResponseCode == 200) 
    { 
    Scanner s; 
    s = new Scanner(connection.getInputStream()); 
    s.useDelimiter("\\Z"); 
    final String response = s.next(); 
    Log.e("Upload Server ", "Message : " + response); 
    return response; 
    }else 
    { 
    Log.e("Upload Server ", "Server Code Error : " + serverResponseCode); 
    return "faild"; 
    } 
    } catch (final Exception e) { 

    Log.e("Upload Server ", "Error : " + e.getMessage()); 
    } 

    return "falid"; 
} 

請注意,Android應用的目標還是較新的:) 我GOOGLE了我的問題,我無法找到一個解決方案,請幫助!

回答

7

「斷開的管道」表示您已寫入已由對等關閉的連接。

可能你已經超過了上傳大小限制。

您還應該注意,您使用available()是無效的。在Javadoc中有一個關於而不是的特定警告,它以您使用它的方式使用它。反正你不需要它:

while ((count = in.read(buffer)) > 0) 
{ 
    out.write(buffer, 0, count); 
} 

其中buffer是任何合理的大小,例如, 8192字節。

+1

當我刪除(connection.setRequestProperty(「連接」,「保持活着」))其工作但有時貓報告連接空! – 2013-04-08 03:23:48

+1

HTTP保持活動實際上是默認值。無論如何,很難看出爲什麼改變它應該會有什麼效果。我不知道你最後四個字是什麼意思。 – EJP 2013-04-08 06:54:29

+0

是的,它工作了一段時間,但之後停止工作。 – 2013-08-26 12:26:13

2

我有一個類似的問題,使用HttpURLConnection。只需添加:

conn.setRequestProperty("connection", "close"); // disables Keep Alive 

到您的連接或禁用所有連接:

System.setProperty("http.keepAlive", "false"); 

從API約斷開():

釋放此連接,這樣它的資源可能重新使用或關閉。 與其他Java實現不同,這不一定會關閉可重用的套接字連接。您可以通過在發出任何HTTP請求之前將http.keepAlive系統屬性設置爲false來禁用所有連接重用。

所以,Android會重用舊套接字連接。使用上面的代碼禁用它可以修復它。