EPIPE (Broken pipe) while uploading?

10,705

Solution 1

'Broken pipe' means you have written to a connection that has already been closed by the peer.

Probably you have exceeded an upload size limit.

You should also note that your use of available() is invalid. There is a specific warning in the Javadoc about not using it the way you are using it. You don't need it anyway:

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

where buffer is any reasonable size, e.g. 8192 bytes.

Solution 2

I had a similar problem using HttpURLConnection. Just add:

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

to your connection or disable it for all connections:

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

From the API about disconnect():

Releases this connection so that its resources may be either reused or closed. Unlike other Java implementations, this will not necessarily close socket connections that can be reused. You can disable all connection reuse by setting the http.keepAlive system property to false before issuing any HTTP requests.

So, Android will reuse the old socket connection. Disabling it with the code above you can fix it.

Share:
10,705
Noob
Author by

Noob

Updated on June 06, 2022

Comments

  • Noob
    Noob almost 2 years

    i have a problem in my code but i don't know where is it the E log report

    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)
    

    what is (EPIPE) ? , when i attempt to upload image its upload successfully but any other file E Cat report (Broken pipe) why !

    this is my uploading code

       @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";
    }
    

    please note aim still newer in android apps :) i googled my problem i couldn't found a solution please help !