android - 在 cordova 2.0 中使用 FileTransfer-plugin 时出现 EPIPE(破管)错误

标签 android cordova cordova-2.0.0

我有一个适用于 Android 的 cordova 2.0 应用程序。我使用 FileTransfer 插件将一些数据加载到我的服务器。第一次执行上传,一切正常。但后来我收到一个 EPIPE(破管)错误。如果我再次按下上传按钮,它就会起作用。

如何防止错误发生?

09-28 17:31:12.304: W/FileTransfer(29497): Error getting HTTP status code from connection.
09-28 17:31:12.304: W/FileTransfer(29497): java.net.SocketException: sendto failed: EPIPE (Broken pipe)
09-28 17:31:12.304: W/FileTransfer(29497):  at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506)
09-28 17:31:12.304: W/FileTransfer(29497):  at libcore.io.IoBridge.sendto(IoBridge.java:475)
09-28 17:31:12.304: W/FileTransfer(29497):  at java.net.PlainSocketImpl.write(PlainSocketImpl.java:507)
09-28 17:31:12.304: W/FileTransfer(29497):  at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
09-28 17:31:12.304: W/FileTransfer(29497):  at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269)
09-28 17:31:12.304: W/FileTransfer(29497):  at libcore.net.http.ChunkedOutputStream.writeHex(ChunkedOutputStream.java:102)
09-28 17:31:12.304: W/FileTransfer(29497):  at libcore.net.http.ChunkedOutputStream.writeBufferedChunkToSocket(ChunkedOutputStream.java:128)
09-28 17:31:12.304: W/FileTransfer(29497):  at libcore.net.http.ChunkedOutputStream.close(ChunkedOutputStream.java:118)
09-28 17:31:12.304: W/FileTransfer(29497):  at libcore.net.http.HttpEngine.readResponse(HttpEngine.java:804)
09-28 17:31:12.304: W/FileTransfer(29497):  at libcore.net.http.HttpURLConnectionImpl.getResponse(HttpURLConnectionImpl.java:274)
09-28 17:31:12.304: W/FileTransfer(29497):  at libcore.net.http.HttpURLConnectionImpl.getResponseCode(HttpURLConnectionImpl.java:486)
09-28 17:31:12.304: W/FileTransfer(29497):  at org.apache.cordova.FileTransfer.createFileTransferError(FileTransfer.java:384)
09-28 17:31:12.304: W/FileTransfer(29497):  at org.apache.cordova.FileTransfer.upload(FileTransfer.java:316)
09-28 17:31:12.304: W/FileTransfer(29497):  at org.apache.cordova.FileTransfer.execute(FileTransfer.java:85)
09-28 17:31:12.304: W/FileTransfer(29497):  at org.apache.cordova.api.PluginManager$1.run(PluginManager.java:192)
09-28 17:31:12.304: W/FileTransfer(29497):  at java.lang.Thread.run(Thread.java:856)
09-28 17:31:12.304: W/FileTransfer(29497): Caused by: libcore.io.ErrnoException: sendto failed: EPIPE (Broken pipe)
09-28 17:31:12.304: W/FileTransfer(29497):  at libcore.io.Posix.sendtoBytes(Native Method)
09-28 17:31:12.304: W/FileTransfer(29497):  at libcore.io.Posix.sendto(Posix.java:146)
09-28 17:31:12.304: W/FileTransfer(29497):  at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
09-28 17:31:12.304: W/FileTransfer(29497):  at libcore.io.IoBridge.sendto(IoBridge.java:473)
09-28 17:31:12.304: W/FileTransfer(29497):  ... 14 more
09-28 17:31:12.319: E/FileTransfer(29497): {"target":"http:\/\/10.100.150.173:8081\/mobile110\/upload","source":"content:\/\/media\/external\/images\/media\/30","code":3}
09-28 17:31:12.319: E/FileTransfer(29497): java.net.SocketException: sendto failed: EPIPE (Broken pipe)
09-28 17:31:12.319: E/FileTransfer(29497):  at libcore.io.IoBridge.maybeThrowAfterSendto(IoBridge.java:506)
09-28 17:31:12.319: E/FileTransfer(29497):  at libcore.io.IoBridge.sendto(IoBridge.java:475)
09-28 17:31:12.319: E/FileTransfer(29497):  at java.net.PlainSocketImpl.write(PlainSocketImpl.java:507)
09-28 17:31:12.319: E/FileTransfer(29497):  at java.net.PlainSocketImpl.access$100(PlainSocketImpl.java:46)
09-28 17:31:12.319: E/FileTransfer(29497):  at java.net.PlainSocketImpl$PlainSocketOutputStream.write(PlainSocketImpl.java:269)
09-28 17:31:12.319: E/FileTransfer(29497):  at libcore.net.http.ChunkedOutputStream.writeHex(ChunkedOutputStream.java:102)
09-28 17:31:12.319: E/FileTransfer(29497):  at libcore.net.http.ChunkedOutputStream.writeBufferedChunkToSocket(ChunkedOutputStream.java:128)
09-28 17:31:12.319: E/FileTransfer(29497):  at libcore.net.http.ChunkedOutputStream.write(ChunkedOutputStream.java:77)
09-28 17:31:12.319: E/FileTransfer(29497):  at java.io.DataOutputStream.write(DataOutputStream.java:98)
09-28 17:31:12.319: E/FileTransfer(29497):  at org.apache.cordova.FileTransfer.upload(FileTransfer.java:261)
09-28 17:31:12.319: E/FileTransfer(29497):  at org.apache.cordova.FileTransfer.execute(FileTransfer.java:85)
09-28 17:31:12.319: E/FileTransfer(29497):  at org.apache.cordova.api.PluginManager$1.run(PluginManager.java:192)
09-28 17:31:12.319: E/FileTransfer(29497):  at java.lang.Thread.run(Thread.java:856)
09-28 17:31:12.319: E/FileTransfer(29497): Caused by: libcore.io.ErrnoException: sendto failed: EPIPE (Broken pipe)
09-28 17:31:12.319: E/FileTransfer(29497):  at libcore.io.Posix.sendtoBytes(Native Method)
09-28 17:31:12.319: E/FileTransfer(29497):  at libcore.io.Posix.sendto(Posix.java:146)
09-28 17:31:12.319: E/FileTransfer(29497):  at libcore.io.BlockGuardOs.sendto(BlockGuardOs.java:177)
09-28 17:31:12.319: E/FileTransfer(29497):  at libcore.io.IoBridge.sendto(IoBridge.java:473)
09-28 17:31:12.319: E/FileTransfer(29497):  ... 11 more

最佳答案

我也一直在努力解决随机的间歇性 HTTP 状态错误,并采用了一种使用 var 来存储重试状态的解决方法。然后,如果调用传输失败回调并重试上传功能最多 3 次(尽管它不需要超过 1 次重试),我会增加此 var:

var imageRetry = 0; // if upload errors, retry 3 times
...
// file transfer fail callback
function fail(error) {
    if(imageRetry < 3){
         imageRetry++;
         uploadPhoto(); // call upload function again
    }else{
        // normal failure handling
    }
}

注意:服务器被列入白名单,我也尝试禁用 chunkedMode 但没有成功。我也没有使用普通或自签名 SSL。就我而言,用户可以在上传前过滤照片。如果没有应用过滤器,上传总是成功的。如果用户尝试应用任何过滤器,上传将随机失败并显示错误代码 3。

(是的,我知道这个解决方案并不完全理想,但总比无法恢复的故障要好。)

关于android - 在 cordova 2.0 中使用 FileTransfer-plugin 时出现 EPIPE(破管)错误,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/12643238/

相关文章:

android - dp真的是设备独立的吗?

android - 在android中以编程方式结束来电

javascript - 单击按钮后重置应用程序

cordova - Windows 8 Phone 的通用自定义插件找不到入口 js 对象

javascript - navigator.app.exitApp();结果是 "TypeError: Cannot call method ' exitApp' 未定义”

javascript - 如何在手机间隙android中打开/关闭面板时停止页面闪烁

java - 在选定的饼图值上创建删除对话框?

安卓定期同步

javascript - 框架7 : How to refresh a page after changing template data?

ios - 媒体查询不适用于 iPhone 和 iPad