我想使用Http Post将图像从android客户端发送到Django服务器。图像从图库中选择。目前,我使用列表值名称Pairs将必要的数据发送到服务器并从JSON接收来自Django的响应。是否可以将相同的方法用于图像(使用嵌入在JSON响应中的图像的URL)?
另外,这是一种更好的方法:远程访问图像而无需从服务器下载图像或将它们下载并存储在Bitmap数组中并在本地使用它们?图像数量少(<10)且尺寸小(50 * 50倾角)。
非常感谢任何解决这些问题的教程。
编辑:从库中选择的图像在将其缩放到所需大小后会发送到服务器。
答案 0 :(得分:143)
我将假设您知道要上传的图像的路径和文件名。使用NameValuePair
作为键名,将此字符串添加到image
。
可以使用HttpComponents libraries发送图像。使用依赖项包下载最新的HttpClient(当前为4.0.1)二进制文件,并将apache-mime4j-0.6.jar
和httpmime-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();
}
}
我希望这能帮助你朝着正确的方向前进。
答案 1 :(得分:14)
版本4.3.5更新代码
由于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();
}
答案 2 :(得分:10)
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
}
});
答案 3 :(得分:5)
我努力尝试使用httpclient-4.3.5.jar,httpcore-4.3.2.jar,httpmime-4.3.5.jar实现从Android客户端向servlet发布图像。我总是遇到运行时错误。我发现基本上你不能在Android上使用这些罐子,因为谷歌在Android中使用旧版本的HttpClient。这里的解释是http://hc.apache.org/httpcomponents-client-4.3.x/android-port.html。您需要从android http-client library获取httpclientandroidlib-1.2.1 jar。然后将导入从or.apache.http.client更改为ch.boye.httpclientandroidlib。希望这会有所帮助。
答案 4 :(得分:-13)
我通常在处理json响应的线程中执行此操作:
try {
Bitmap bitmap = BitmapFactory.decodeStream((InputStream)new URL(imageUrl).getContent());
} catch (MalformedURLException e) {
e.printStackTrace();
} catch (IOException e) {
e.printStackTrace();
}
如果你需要对图像进行转换,你需要创建一个Drawable而不是Bitmap。