Android Java HTTP Post .bin 文件

Posted

技术标签:

【中文标题】Android Java HTTP Post .bin 文件【英文标题】:Android Java HTTP Post .bin file 【发布时间】:2021-12-21 21:07:30 【问题描述】:

我正在尝试将 .bin 文件从 android Java 移动应用程序上传到 ESP32 网络服务器。我知道上传工作正常,因为我可以在网络浏览器上对其进行测试,但我尝试了 *** 的不同解决方案,例如 Volley、httpClient 等,但它在传输时崩溃了。

任何帮助如何完成文件上传,看起来很简单,因为它只是一个HTTP post文件传输,但无法让它工作。

http 代码

    xhttp.open("POST", upload_path, true);
    xhttp.send(file);

安卓代码

public void uploadfile() throws Exception

    try 

        File file = new File("/storage/emulated/0/Download/testfile.bin");
        if (file.exists()) 

            CloseableHttpClient httpClient = HttpClients.createDefault();
            HttpPost uploadFile = new HttpPost("http://10.10.10.1/upload/");
            MultipartEntityBuilder builder = MultipartEntityBuilder.create();
           // builder.addTextBody("field1", "yes", ContentType.DEFAULT_BINARY);

           // This attaches the file to the POST:
            File f = new File("/storage/emulated/0/Download/testfile.bin");
            builder.addBinaryBody(
                    "file",
                    new FileInputStream(f),
                    ContentType.DEFAULT_BINARY,
                    f.getName()
            );

            HttpEntity multipart = builder.build();
            uploadFile.setEntity(multipart);
            // Code is crashing here 
            CloseableHttpResponse response = httpClient.execute(uploadFile);
            HttpEntity responseEntity = response.getEntity();
        
    
    catch (Exception e)
    
        Log.d("Debug", "Catch - software activity 1050");
    

=== 更新 ===

我已将代码更新为以下内容,现在出现“java.net.SocketException:连接重置”错误。不确定 contentType 是否需要更改,因为它是使用引用 (https://square.github.io/okhttp/3.x/okhttp/index.html?okhttp3/MediaType.html) 的二进制文件,不确定文本文件还有什么期望。

我有一个服务器 500 错误,所以它必须与服务器通信。

   file = new File("/storage/emulated/0/Download/test-1.fw"); 
                filename = "test-1.fw";
                final MediaType contentType = MediaType.parse("text/plain");
                RequestBody requestBody = new MultipartBody.Builder()

                        .setType(MultipartBody.FORM)
                        .addFormDataPart("test-1.fw", filename, RequestBody.create(file,contentType))
                        .build();
                Request request = new Request.Builder()
                        .url("http://10.10.2.0/upload/file.bin")
                        .post(requestBody)
                        .build();

                try (Response response = client.newCall(request).execute()) 
                    if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

                    System.out.println(response.body().string());
                 catch (IOException e) 
                    e.printStackTrace();
                

清单文件

<uses-permission android:name="android.permission.INTERNET"/>
<uses-permission android:name="android.permission.READ_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.MANAGE_EXTERNAL_STORAGE"/>
<uses-permission android:name="android.permission.WRITE_EXTERNAL_STORAGE"/>

【问题讨论】:

HttpClient 出局了。请改用 HttpUrlConnection。或者使用图书馆。 【参考方案1】:

获取异常的堆栈跟踪会很有用,以便确定问题的原因。 您可以提供的另一个有用信息是您正在运行的 Android 版本。 Android 应用中 http 失败的可能原因可能是:

    在 Android 清单中缺少 internet permission? 解决方法:在AndroidManifest.xml中添加如下语句:

    您正在使用 http 协议,但从 Android 9 开始,此协议受到限制 解决方案 1:使用 https 协议而不是 http 解决方案2:在AndroidManifest.xml中添加usesCleartextTraffic属性:

    android:usesCleartextTraffic="true"

【讨论】:

我们已将它们添加到 AndroidManifest.xml 文件中,但没有 android:usesCleartextTraffic="true" 行,因此我将添加它并尝试一下。有趣的是,我们需要使用 https,这可能是问题所在。我只是在研究如何实现“HttpUrlConnection”软件 非常感谢您提供的信息和帮助【参考方案2】:

所以最后如果我删除了它工作的标题正文,服务器端不喜欢 html 内容。非常简单,可以使用以下方法工作

   file = new File("/storage/emulated/0/Download/test-1.fw"); 
            filename = "test-1.fw";
            final MediaType contentType = MediaType.parse("text/plain");
            RequestBody requestBody = new MultipartBody.Builder()

                
                    .addFormDataPart("test-1.fw", filename, RequestBody.create(file,contentType))
                    .build();
            Request request = new Request.Builder()
                    .url("http://10.10.2.0/upload/file.bin")
                    .post(requestBody)
                    .build();

            try (Response response = client.newCall(request).execute()) 
                if (!response.isSuccessful()) throw new IOException("Unexpected code " + response);

                System.out.println(response.body().string());
             catch (IOException e) 
                e.printStackTrace();
            

【讨论】:

以上是关于Android Java HTTP Post .bin 文件的主要内容,如果未能解决你的问题,请参考以下文章

android的自带的httpClient 怎么上传文件

java调用post请求到localhost:4040

Java:在 Ruby on Rails 应用程序中创建新“产品”的 HTTP Post

一起Talk Android吧(第三百三十五回: Android中的HTTP请求二)

java 怎样发送 POST

android中Invalidate和postInvalidate的区别