7

Android用のcordova 2.0アプリがあります。FileTransfer プラグインを使用して、サーバーにデータをロードします。初めてアップロードを実行すると、すべて正常に動作します。しかし、その後、EPIPE (Broken Pipe) エラーが発生します。アップロードボタンをもう一度押すだけで機能します。

どうすればエラーを防ぐことができますか?

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
4

1 に答える 1

7

また、ランダムで断続的な HTTP ステータス エラーにも取り組んでおり、var を使用して再試行ステータスを保存する回避策を採用しました。次に、転送失敗のコールバックが呼び出された場合にこの変数をインクリメントし、アップロード関数を最大 3 回再試行します (ただし、再試行は 1 回しか必要ありません)。

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 または自己署名 SSL も使用していません。私の場合、ユーザーはアップロードする前に写真をフィルタリングできます。フィルタが適用されていない場合、アップロードは常に成功します。ユーザーがフィルターを適用しようとすると、エラー コード 3 でランダムにアップロードが失敗します。

(そして、はい、このソリューションが完全に理想的ではないことはわかっていますが、回復されない障害よりはましです。)

于 2012-10-01T07:08:32.683 に答える