使用 Http Post 发送图像

我想使用 Http Post 将一个图像从 android 客户机发送到 Django 服务器。图像是从画廊中选择的。目前,我正在使用列表值名称双向发送必要的数据到服务器,并接收来自 JSON 的 Django 的响应。是否可以对图像使用相同的方法(将图像的 URL 嵌入到 JSON 响应中) ?

另外,哪种方法更好: 远程访问图像而不从服务器下载,或者下载并存储在一个 Bitmap 数组中,然后在本地使用它们?图像数量少(< 10) ,尺寸小(50 * 50倾角)。

如能提供解决这些问题的教程,我将不胜感激。

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

159116 次浏览

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

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

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

我假设您知道要上传的图像的路径和文件名。使用 image作为键名将此字符串添加到 NameValuePair

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

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

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;

现在您可以创建一个 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。然后将您的导入从 or.apache.http.client 更改为 ch.boye.httpclientandroidlib。希望这个能帮上忙。