通过 HttpPost 从 Android 将图像(jpg)发送到 Servlet(WebServer)

Posted

技术标签:

【中文标题】通过 HttpPost 从 Android 将图像(jpg)发送到 Servlet(WebServer)【英文标题】:Send image(jpg) via HttpPost from Android to Servlet(WebServer) 【发布时间】:2011-05-02 03:43:56 【问题描述】:

我的 SD 卡(jpg 类型)上有一张图片,我正在尝试通过 HttpPost 将图片发送到我在 Apache Tomcat 7.0 上运行的 servlet

到目前为止,我已经用谷歌搜索了这样做的方法,但我似乎找不到完美的方法。

你们中的任何人可能对这个问题有什么建议或解决方案吗?

提前谢谢你, 萨米·史蒂文·贾普

【问题讨论】:

【参考方案1】:

HttpClient 是要使用的类,并且有一个 tutorial 用于它。请参阅图片之后的使用 HTTP 客户端部分。

更新 以下是来自Developerlife.com 的教程示例的评论。该示例的一个好处是它演示了如何通过将一种类型编码为另一种类型来发送各种类型的数据。通过从链中与要发送的数据类型匹配的点开始,可以发送该数据转换链中使用的任何类型:

Strings 被放入一个 Hashtable 中,该 Hashtable 被写入一个 ObjectOutputStream,该 ByteArrayOutputStream 支持该 ByteArrayOutputStream转换成 ByteArray 再转换成 ByteArrayEntity 进行传输。

要仅发送 ByteArray,请跳过在数据变为 ByteArray 之前发生的所有步骤。跳转到第 26 行,其中使用toByteArray().

创建了一个 ByteArray

要发送其他类型,请执行以下操作(根据示例): 第 26 行:ByteArray,用它来做一个 ByteArrayEntity 第 26 行:ByteArrayOutputStream,将其转换为 ByteArray 第 24 行:ObjectOutputStreams:在 ByteArrayOutputStreams 上创建它们 第 25 行:Objects:将 StringsHashtables 等写入 ObjectOutputStream

 1 /** this method is called in a non-"edt" thread */
 2 private void _doInBackgroundPost() 
 3   Log.i(getClass().getSimpleName(), "background task - start");
 4 
 5 
 6   Hashtable<String, String> map = new Hashtable();
 7   map.put("uid", uid);
 8   map.put("pwd", pwd);
 9 
10   try 
11     HttpParams params = new BasicHttpParams();
12 
13     // set params for connection...
14     HttpConnectionParams.setStaleCheckingEnabled(params, false);
15     HttpConnectionParams.setConnectionTimeout(params, NetworkConnectionTimeout_ms);
16     HttpConnectionParams.setSoTimeout(params, NetworkConnectionTimeout_ms);
17     DefaultHttpClient httpClient = new DefaultHttpClient(params);
18 
19     // create post method
20     HttpPost postMethod = new HttpPost(LoginServiceUri);
21 
22     // create request entity
23     ByteArrayOutputStream baos = new ByteArrayOutputStream();
24     ObjectOutputStream oos = new ObjectOutputStream(baos);
25     oos.writeObject(map);
26     ByteArrayEntity req_entity = new ByteArrayEntity(baos.toByteArray());
27     req_entity.setContentType(MIMETypeConstantsIF.BINARY_TYPE);
28 

【讨论】:

好吧,我以前看过这个教程,但是它展示了发送字符串的方式。我不知道如何用同样的方法发送一个字节[] 不,他们发送由 ByteArray 制成的 ByteArrayEntity。 ByteArray 恰好是在大约 6 次转换之前从 Strings 创建的。 Strings like "pwd" in Java are Objects,比 C 风格的字符串复杂得多,后者非常接近 ByteArray。 我更新了答案,希望对如何发送 ByteArray 有更清晰的解释。 在使用所需的某些社交媒体(例如 Facebook)进行 LOGIN 和 LOGOUT 逻辑时是否也有用?【参考方案2】:

我以更简洁的方式完成了这项工作,但使用的是 asp.net 'web form'。我相信有人可以轻松地在 servlet 中对其进行改造。你可以找到我的解决方案here。

干杯

法哈

【讨论】:

以上是关于通过 HttpPost 从 Android 将图像(jpg)发送到 Servlet(WebServer)的主要内容,如果未能解决你的问题,请参考以下文章

无法将图像文件从 Android 应用程序发布到托管在 Tomcat 上的 Java servlet

使用 Http Post 发送图像

Android 相机图像未上传到服务器。使用多部分数据 Http post

如何将字节数组中的图像发送到从android到具有Flask的python的url [重复]

从 EditText 获取文本并在 Android 中使用 HttpPost 发送

编辑 NEW 使用 HttpPost 将数据从控制器传递到视图