上传时EPIPE(断管)?

我的代码有问题,但我不知道E日志报告在哪里

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 Cat报告(断管)为什么!

这是我的上传代码

  @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我的问题我找不到解决方案,请帮助!

‘Broken pipe’表示您已写入已被对等方关闭的连接。

可能您已超出上传大小限制。

您还应注意,您对available()使用无效。 Javadoc中有一个特定的警告,即按照您使用它的方式使用它。 你无论如何都不需要它:

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

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

我使用HttpURLConnection遇到了类似的问题。 只需添加:

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

连接或禁用所有连接:

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

从关于disconnect()的API:

释放此连接,以便可以重用或关闭其资源。 与其他Java实现不同,这不一定会关闭可以重用的套接字连接。 您可以通过在发出任何HTTP请求之前将http.keepAlive系统属性设置为false来禁用所有连接重用。

因此,Android将重用旧的套接字连接。 使用上面的代码禁用它可以解决它。