由于Android开发人员recommend使用 HttpURLConnection
类,我想知道是否有人能够提供一个关于如何通过POST将位图"file"(实际上是内存中的流)发送到Apache HTTP服务器的好例子 . 我在这里看到的'm not interested in cookies or authentication or anything complicated, but I just want to have a reliable and logic implementation. All the examples that I'看起来更像"let's try this and maybe it works" .
现在,我有这个代码:
URL url;
HttpURLConnection urlConnection = null;
try {
url = new URL("http://example.com/server.cgi");
urlConnection = (HttpURLConnection) url.openConnection();
} catch (Exception e) {
this.showDialog(getApplicationContext(), e.getMessage());
}
finally {
if (urlConnection != null)
{
urlConnection.disconnect();
}
}
showDialog应该只显示 AlertDialog
(如果URL无效?) .
现在,假设我生成一个如此的位图: Bitmap image = this.getBitmap()
在一个从 View
派生的控件中,我想通过POST发送它 . 实现这样的事情的正确程序是什么?我需要使用哪些课程?我能在_1362686中使用 HttpPost
吗?如果是这样,我将如何为我的位图构建 InputStreamEntity
?我觉得要首先将位图存储在设备上的文件中是令人反感的 .
我还要提一下,我真的需要将原始位图的每个未经改变的像素发送到服务器,因此我无法将其转换为JPEG .
10 回答
我不知道为什么
HttpURLConnection
类没有提供任何手段来发送文件而不必手动编写文件包装器 . 这是我最终做的事情,但如果有人知道更好的解决方案,请告诉我 .输入数据:
静电东西:
设置请求:
启动内容包装器:
将
Bitmap
转换为ByteBuffer
:结束内容包装器:
刷新输出缓冲区:
得到回应:
关闭响应流:
关闭连接:
PS:当然我必须在
private class AsyncUploadBitmaps extends AsyncTask<Bitmap, Void, String>
中包装请求,以使Android平台满意,因为它不喜欢在主线程上有网络请求 .我实际上找到了一种使用MultipartEntity使用HttpURLConnection发送文件的更好方法
假设您要上传包含位图数据的图像:
还有瞧!您的帖子数据将包含图片字段以及服务器上的文件名和路径 .
使用
MultipartUtility
以简单的方式使用某个参数在服务器上上载文件 .MultipartUtility.java
要
upload
你file
以及参数 .注意:将此代码放在非ui-thread中以获得响应 .
Jaydipsinh Zala 的解决方案没有知道为什么,因为它似乎太接近解决方案了 .
所以我把这个与 Mihai Todor 的伟大解决方案和解释合并,现在这个类适合我 . 如果有人帮助:
MultipartUtility2V.java
基于Mihai的解决方案,如果有人在服务器上保存图像的问题,就像在我的服务器上发生的那样 . 将位图更改为bytebuffer部分:
我没有测试过这个,但您可以尝试使用PipedInputStream和PipedOutputStream . 它可能看起来像:
这个答案让我在将大型文件上传到开发Django服务器的过程中占了90%,但我不得不使用setFixedLengthStreamingMode来使其工作 . 这需要在写入内容之前设置内容长度,因此需要对上述答案进行相当重要的重写 . 这是我的最终结果
用法与上面的答案大致相同,但我已经包含了Django默认使用表单的CSRF支持
这是我使用帖子请求上传照片所做的 .
NOTE: 此代码需要库,因此请按照here的说明获取库 .
我发现使用okHttp要容易得多,因为我无法使用任何这些解决方案:https://stackoverflow.com/a/37942387/447549
我尝试了上面的解决方案,没有一个能为我开箱即用 .
但是http://www.baeldung.com/httpclient-post-http-request . 第6行POST多部分请求在几秒钟内完成