Android 4.0.3向PHP服务器发送HTTP POST文件失败

Android 4.0.3向PHP服务器发送HTTP POST文件失败,http,post,android-4.0-ice-cream-sandwich,Http,Post,Android 4.0 Ice Cream Sandwich,我刚刚将我的Android从2.3.4升级到4.0.3,但是当我想通过http post方法将一个文件(大约2MB)发布到php服务器时,发现了一个问题。但看起来安卓4.0.3不起作用,而安卓2.3.4运行良好 以下是我发布文件的Android代码的一部分: private boolean postFile(String urlstr, String localpath, String uploadname) { HttpURLConnection conn = null; Da

我刚刚将我的Android从2.3.4升级到4.0.3,但是当我想通过http post方法将一个文件(大约2MB)发布到php服务器时,发现了一个问题。但看起来安卓4.0.3不起作用,而安卓2.3.4运行良好

以下是我发布文件的Android代码的一部分:

private boolean postFile(String urlstr, String localpath, String uploadname) {
    HttpURLConnection conn = null;
    DataOutputStream os = null;
    String lineEnd = "\r\n";
    String twoHyphens = "--";
    String boundary =  "*****";
    int bytesRead, bytesAvailable, bufferSize, bytesUploaded = 0;
    byte[] buffer;
    int maxBufferSize = 2*1024*1024;

    try
    {
        FileInputStream fis = new FileInputStream(new File(localpath) );

        URL url = new URL(urlstr);
        conn = (HttpURLConnection) url.openConnection();
        conn.setChunkedStreamingMode(maxBufferSize);

        // POST settings.
        conn.setDoInput(true);
        conn.setDoOutput(true);
        conn.setUseCaches(false);
        conn.setRequestMethod("POST");
        conn.setRequestProperty("Connection", "Keep-Alive");
        conn.setRequestProperty("Content-Type", "multipart/form-data; boundary="+boundary);

        os = new DataOutputStream(conn.getOutputStream());
        os.writeBytes(twoHyphens + boundary + lineEnd);
        os.writeBytes("Content-Disposition: form-data; name=\"uploadedfile\";filename=\"" + uploadname +"\"" + lineEnd);
        os.writeBytes(lineEnd);

        bytesAvailable = fis.available();
        System.out.println("available: " + String.valueOf(bytesAvailable));
        bufferSize = Math.min(bytesAvailable, maxBufferSize);
        buffer = new byte[bufferSize];

        prog = 0;
        bytesRead = fis.read(buffer, 0, bufferSize);
        bytesUploaded += bytesRead;
        while (bytesRead > 0)
        {
            prog = bytesUploaded/bytesAvailable;
            os.write(buffer, 0, bufferSize);
            bytesAvailable = fis.available();
            bufferSize = Math.min(bytesAvailable, maxBufferSize);
            buffer = new byte[bufferSize];
            bytesRead = fis.read(buffer, 0, bufferSize);
            bytesUploaded += bytesRead;
        }
        System.out.println("uploaded: "+String.valueOf(bytesUploaded));
        os.writeBytes(lineEnd);
        os.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

        // Responses from the server (code and message)
        conn.setConnectTimeout(2000); // allow 2 seconds timeout.
        int rcode = conn.getResponseCode();
        if (rcode == 200) Toast.makeText(getApplicationContext(), "Success!!", Toast.LENGTH_LONG).show();
        else Toast.makeText(getApplicationContext(), "Failed!!", Toast.LENGTH_LONG).show();
        //String rmsg = conn.getResponseMessage();
        fis.close();
        os.flush();
        os.close();
        return rcode == 200;
    }
    catch (Exception ex)
    {
        ex.printStackTrace();
        return false;
    }
}
然后我得到以下异常:

02-02 22:38:34.626: W/System.err(5547): android.os.NetworkOnMainThreadException
02-02 22:38:34.631: W/System.err(5547): at android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
02-02 22:38:34.631: W/System.err(5547):     at libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
02-02 22:38:34.631: W/System.err(5547):     at libcore.io.IoBridge.connectErrno(IoBridge.java:127)
02-02 22:38:34.636: W/System.err(5547):     at libcore.io.IoBridge.connect(IoBridge.java:112)
02-02 22:38:34.641: W/System.err(5547):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
02-02 22:38:34.641: W/System.err(5547):     at java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
02-02 22:38:34.641: W/System.err(5547):     at java.net.Socket.connect(Socket.java:842)
02-02 22:38:34.641: W/System.err(5547):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:77)
02-02 22:38:34.646: W/System.err(5547):     at libcore.net.http.HttpConnection.<init>(HttpConnection.java:50)
02-02 22:38:34.646: W/System.err(5547):     at libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
02-02 22:38:34.646: W/System.err(5547):     at libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
02-02 22:38:34.646: W/System.err(5547):     at libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
02-02 22:38:34.651: W/System.err(5547):     at libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
02-02 22:38:34.651: W/System.err(5547):     at libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
02-02 22:38:34.651: W/System.err(5547):     at libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
02-02 22:38:34.651: W/System.err(5547):     at libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
02-02 22:38:34.656: W/System.err(5547):     at libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
02-02 22:38:34.656: W/System.err(5547):     at libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
02-02 22:38:34.656: W/System.err(5547):     at edu.socialsense.SocialsenseService.postFile(SocialsenseService.java:324)
02-02 22:38:34.661: W/System.err(5547):     at edu.socialsense.SocialsenseService.report(SocialsenseService.java:285)
02-02 22:38:34.661: W/System.err(5547):     at edu.socialsense.SocialsenseService.access$7(SocialsenseService.java:279)
02-02 22:38:34.661: W/System.err(5547):     at edu.socialsense.SocialsenseService$1.onReceive(SocialsenseService.java:79)
02-02 22:38:34.661: W/System.err(5547):     at android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:728)
02-02 22:38:34.661: W/System.err(5547):     at android.os.Handler.handleCallback(Handler.java:605)
02-02 22:38:34.666: W/System.err(5547):     at android.os.Handler.dispatchMessage(Handler.java:92)
02-02 22:38:34.666: W/System.err(5547):     at android.os.Looper.loop(Looper.java:137)
02-02 22:38:34.666: W/System.err(5547):     at android.app.ActivityThread.main(ActivityThread.java:4507)
02-02 22:38:34.666: W/System.err(5547):     at java.lang.reflect.Method.invokeNative(Native Method)
02-02 22:38:34.671: W/System.err(5547):     at java.lang.reflect.Method.invoke(Method.java:511)
02-02 22:38:34.671: W/System.err(5547):     at com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
02-02 22:38:34.671: W/System.err(5547):     at com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
02-02 22:38:34.671: W/System.err(5547):     at dalvik.system.NativeStart.main(Native Method)
02-02 22:38:34.626:W/System.err(5547):android.os.NetworkOnMainThreadException
02-02 22:38:34.631:W/System.err(5547):在android.os.StrictMode$AndroidBlockGuardPolicy.onNetwork(StrictMode.java:1099)
02-02 22:38:34.631:W/System.err(5547):位于libcore.io.BlockGuardOs.connect(BlockGuardOs.java:84)
02-02 22:38:34.631:W/System.err(5547):位于libcore.io.IoBridge.connectErrno(IoBridge.java:127)
02-02 22:38:34.636:W/System.err(5547):位于libcore.io.IoBridge.connect(IoBridge.java:112)
02-02 22:38:34.641:W/System.err(5547):位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:192)
02-02 22:38:34.641:W/System.err(5547):位于java.net.PlainSocketImpl.connect(PlainSocketImpl.java:459)
02-02 22:38:34.641:W/System.err(5547):位于java.net.Socket.connect(Socket.java:842)
02-02 22:38:34.641:W/System.err(5547):位于libcore.net.http.HttpConnection.(HttpConnection.java:77)
02-02 22:38:34.646:W/System.err(5547):位于libcore.net.http.HttpConnection.(HttpConnection.java:50)
02-02 22:38:34.646:W/System.err(5547):位于libcore.net.http.HttpConnection$Address.connect(HttpConnection.java:351)
02-02 22:38:34.646:W/System.err(5547):位于libcore.net.http.HttpConnectionPool.get(HttpConnectionPool.java:86)
02-02 22:38:34.646:W/System.err(5547):位于libcore.net.http.HttpConnection.connect(HttpConnection.java:128)
02-02 22:38:34.651:W/System.err(5547):位于libcore.net.http.HttpEngine.openSocketConnection(HttpEngine.java:308)
02-02 22:38:34.651:W/System.err(5547):位于libcore.net.http.HttpEngine.connect(HttpEngine.java:303)
02-02 22:38:34.651:W/System.err(5547):位于libcore.net.http.HttpEngine.sendSocketRequest(HttpEngine.java:282)
02-02 22:38:34.651:W/System.err(5547):位于libcore.net.http.HttpEngine.sendRequest(HttpEngine.java:232)
02-02 22:38:34.656:W/System.err(5547):位于libcore.net.http.HttpURLConnectionImpl.connect(HttpURLConnectionImpl.java:80)
02-02 22:38:34.656:W/System.err(5547):位于libcore.net.http.HttpURLConnectionImpl.getOutputStream(HttpURLConnectionImpl.java:188)
02-02 22:38:34.656:W/System.err(5547):位于edu.socialsense.SocialsenseService.postFile(SocialsenseService.java:324)
02-02 22:38:34.661:W/System.err(5547):在edu.socialsense.SocialsenseService.report(SocialsenseService.java:285)
02-02 22:38:34.661:W/System.err(5547):在edu.socialsense.SocialsenseService.access$7(SocialsenseService.java:279)
02-02 22:38:34.661:W/System.err(5547):在edu.socialsense.SocialsenseService$1.onReceive(SocialsenseService.java:79)
02-02 22:38:34.661:W/System.err(5547):在android.app.LoadedApk$ReceiverDispatcher$Args.run(LoadedApk.java:728)
02-02 22:38:34.661:W/System.err(5547):位于android.os.Handler.handleCallback(Handler.java:605)
02-02 22:38:34.666:W/System.err(5547):位于android.os.Handler.dispatchMessage(Handler.java:92)
02-02 22:38:34.666:W/System.err(5547):位于android.os.Looper.loop(Looper.java:137)
02-02 22:38:34.666:W/System.err(5547):位于android.app.ActivityThread.main(ActivityThread.java:4507)
02-02 22:38:34.666:W/System.err(5547):位于java.lang.reflect.Method.invokenactive(本机方法)
02-02 22:38:34.671:W/System.err(5547):位于java.lang.reflect.Method.invoke(Method.java:511)
02-02 22:38:34.671:W/System.err(5547):在com.android.internal.os.ZygoteInit$MethodAndArgsCaller.run(ZygoteInit.java:789)
02-02 22:38:34.671:W/System.err(5547):位于com.android.internal.os.ZygoteInit.main(ZygoteInit.java:556)
02-02 22:38:34.671:W/System.err(5547):在dalvik.System.NativeStart.main(本机方法)
当我一步一步地跟踪代码时,我发现url连接尝试连接时发生了异常,例如conn.connect()或conn.getOutputStream()

请帮我做这个

非常感谢你

从Android4.0开始,“HttpUrlConnection”方法默认使用“get”方法

如果添加
SetDoOutput(true)”,
property“POST”方法将被调用

底线是“请删除
conn.setDoOutput(true)然后运行

请告诉我这是否解决了您的问题。

从Android4.0开始,“HttpUrlConnection”方法默认使用“get”方法

如果添加
SetDoOutput(true)”,
property“POST”方法将被调用

底线是“请删除
conn.setDoOutput(true)然后运行


请告诉我这是否解决了您的问题。

android.os.NetworkOnMainThreadException被抛出


您不应该在主线程上执行网络操作。这将导致你的应用程序没有响应。在Honeycom之前,你可以侥幸逃脱,但是Honeycom和更新的Android版本会检查并抛出你遇到的异常。另请参见Android开发者API。将引发Android.os.NetworkOnMainThreadException


您不应该在主线程上执行网络操作。这将导致你的应用程序没有响应。在Honeycom之前,你可以侥幸逃脱,但是Honeycom和更新的Android版本会检查并抛出你遇到的异常。另请参阅Android开发者API。

谢谢@BalaK Taduri,但当我删除这一行时,代码似乎仍然不正确。我收到了上面列出的相同错误。谢谢@BalaK Taduri,但是当我删除这行代码时,代码似乎仍然不正确。我收到了上面列出的相同错误。