使用Http Post发送图像

我想发送一个图像从Android客户端到Django服务器使用Http Post。 图片是从画廊中select的。 目前,我正在使用列表值名称对将必要的数据发送到服务器,并从JSON接收来自Django的响应。 可以使用相同的方法来处理图像(使用embedded在JSON响应中的图像的URL)?

另外,这是一个更好的方法:远程访问图像,而不从服务器下载或下载并将它们存储在位图数组中,并在本地使用它们? 图像数量less(<10),尺寸小(50×50倾angular)。

任何教程来解决这些问题将不胜感激。

编辑:从图库中select的图像缩放到所需的大小后,发送到服务器。

我假设你知道你要上传的图像的path和文件名。 将此string添加到您的NameValuePair使用image作为键名称。

发送图像可以使用HttpComponents库来完成。 使用依赖包下载最新的HttpClient(当前为4.0.1 )二进制文件,并将apache-mime4j-0.6.jarhttpmime-4.0.1.jar到您的项目中,并将它们添加到您的Java构buildpath中。

您将需要添加以下导入到您的类。

 import org.apache.http.entity.mime.HttpMultipartMode; import org.apache.http.entity.mime.MultipartEntity; import org.apache.http.entity.mime.content.FileBody; import org.apache.http.entity.mime.content.StringBody; 

现在,您可以创build一个MultipartEntity来将图像附加到您的POST请求。 以下代码显示了如何执行此操作的示例:

 public void post(String url, List<NameValuePair> nameValuePairs) { HttpClient httpClient = new DefaultHttpClient(); HttpContext localContext = new BasicHttpContext(); HttpPost httpPost = new HttpPost(url); try { MultipartEntity entity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE); for(int index=0; index < nameValuePairs.size(); index++) { if(nameValuePairs.get(index).getName().equalsIgnoreCase("image")) { // If the key equals to "image", we use FileBody to transfer the data entity.addPart(nameValuePairs.get(index).getName(), new FileBody(new File (nameValuePairs.get(index).getValue()))); } else { // Normal string data entity.addPart(nameValuePairs.get(index).getName(), new StringBody(nameValuePairs.get(index).getValue())); } } httpPost.setEntity(entity); HttpResponse response = httpClient.execute(httpPost, localContext); } catch (IOException e) { e.printStackTrace(); } } 

我希望这可以帮助你一点正确的方向。

版本4.3.5更新的代码

  • HttpClient的-4.3.5.jar
  • 的HttpCore-4.3.2.jar
  • httpmime-4.3.5.jar

由于MultipartEntity已被弃用 。 请参阅下面的代码。

 String responseBody = "failure"; HttpClient client = new DefaultHttpClient(); client.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1); String url = WWPApi.URL_USERS; Map<String, String> map = new HashMap<String, String>(); map.put("user_id", String.valueOf(userId)); map.put("action", "update"); url = addQueryParams(map, url); HttpPost post = new HttpPost(url); post.addHeader("Accept", "application/json"); MultipartEntityBuilder builder = MultipartEntityBuilder.create(); builder.setCharset(MIME.UTF8_CHARSET); if (career != null) builder.addTextBody("career", career, ContentType.create("text/plain", MIME.UTF8_CHARSET)); if (gender != null) builder.addTextBody("gender", gender, ContentType.create("text/plain", MIME.UTF8_CHARSET)); if (username != null) builder.addTextBody("username", username, ContentType.create("text/plain", MIME.UTF8_CHARSET)); if (email != null) builder.addTextBody("email", email, ContentType.create("text/plain", MIME.UTF8_CHARSET)); if (password != null) builder.addTextBody("password", password, ContentType.create("text/plain", MIME.UTF8_CHARSET)); if (country != null) builder.addTextBody("country", country, ContentType.create("text/plain", MIME.UTF8_CHARSET)); if (file != null) builder.addBinaryBody("Filedata", file, ContentType.MULTIPART_FORM_DATA, file.getName()); post.setEntity(builder.build()); try { responseBody = EntityUtils.toString(client.execute(post).getEntity(), "UTF-8"); // System.out.println("Response from Server ==> " + responseBody); JSONObject object = new JSONObject(responseBody); Boolean success = object.optBoolean("success"); String message = object.optString("error"); if (!success) { responseBody = message; } else { responseBody = "success"; } } catch (Exception e) { e.printStackTrace(); } finally { client.getConnectionManager().shutdown(); } 

loopj库可以直接用于此目的:

 SyncHttpClient client = new SyncHttpClient(); RequestParams params = new RequestParams(); params.put("text", "some string"); params.put("image", new File(imagePath)); client.post("http://example.com", params, new TextHttpResponseHandler() { @Override public void onFailure(int statusCode, Header[] headers, String responseString, Throwable throwable) { // error handling } @Override public void onSuccess(int statusCode, Header[] headers, String responseString) { // success } }); 

http://loopj.com/

我试图用httpclient-4.3.5.jar,httpcore-4.3.2.jar,httpmime-4.3.5.jar来实现从Android客户端向servlet发布图像。 我总是得到一个运行时错误。 我发现基本上你不能在Android上使用这些jar,因为Google在Android中使用的是旧版本的HttpClient。 这里的解释是http://hc.apache.org/httpcomponents-client-4.3.x/android-port.html 。 您需要从android http-client库获取httpclientandroidlib-1.2.1 jar。 然后将您的input从or.apache.http.client更改为ch.boye.httpclientandroidlib。 希望这可以帮助。

我通常在处理json响应的线程中这样做:

 try { Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageUrl).getContent()); } catch (MalformedURLException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } 

如果您需要对图像进行转换,则需要创build一个Drawable而不是Bitmap。