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 文件的主要内容,如果未能解决你的问题,请参考以下文章
Java:在 Ruby on Rails 应用程序中创建新“产品”的 HTTP Post