我使用JSON
和REST
api来使用网络服务。
现在我还需要在请求中发送图像。有可能吗?
如果是,我需要在客户端/服务器端进行哪些更改。
在我的Java代码中,我应该如何发送图像内容(我是否需要单独设置内容类型)?
答案 0 :(得分:2)
适用于我的示例应用程序端代码。你可以在一个valuepair中发送图像,在另一个valuepair中发送json :(这里“uploadedfile”标签将valuepair定义为在post函数检查期间sd卡中图像文件的路径,其他标签将被视为文本数据)
List<NameValuePair> values; values = new ArrayList<NameValuePair>();
System.out.println(Constants.all_datas.get(pos).getBookName());
values.add(new NameValuePair("uploadedfile",
Constants.book_image_path
+ Constants.all_datas.get(pos).getImage()));
values.add(new NameValuePair("id", Constants.all_datas.get(pos)
.getBookid() + ""));
values.add(new NameValuePair("bookname", Constants.all_datas
.get(pos).getBookName()));
values.add(new NameValuePair("price", Constants.all_datas.get(
pos).getPrice()));
values.add(new NameValuePair("writtername", Constants.all_datas
.get(pos).getWritterName()));
values.add(new NameValuePair("publishername",
Constants.all_datas.get(pos).getPublisherName()));
post(values);
//发布功能
public void post(final List<NameValuePair> nameValuePairs) {
// Setting progressDialog properties
progressDialog = ProgressDialog.show(CustomBookActivity.this, "",
"Syncing Book Data...");
mHandler = new Handler();
// Function to run after thread
mUpdateResults = new Runnable() {
public void run() {
progressDialog.dismiss();
// Something
}
};
new Thread() {
@Override
public void run() {
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("uploadedfile")) {
// If the key equals to "uploadedfile", 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);
HttpEntity result_entity = response.getEntity();
String htmlResponse = EntityUtils.toString(result_entity);
result = htmlResponse;
System.out.println("SYNC:::" + result);
// server = true;
} catch (IOException e) {
e.printStackTrace();
// server = false;
}
// dismiss the progress dialog
// Calling post function
mHandler.post(mUpdateResults);
}
}.start();
}
Apache Mime4J,HTTPCore,HTTPMime libary jar需要添加到项目中
答案 1 :(得分:2)
这样做的方法是将其作为内容发送到HttpPost请求中,如下所示
HttpClient client = new DefaultHttpClient();
HttpPost postRequest = new HttpPost(url);
String body = getMessageBody();
try
{
postRequest.setEntity(new StringEntity(body, "UTF8"));
postRequest.setHeader("Content-Type", "application/x-www-form-urlencoded");
HttpResponse response = client.execute(postRequest);
return response;
} catch (UnsupportedEncodingException e)
{
e.printStackTrace();
} catch (ClientProtocolException e)
{
e.printStackTrace();
} catch (IOException e)
{
e.printStackTrace();
}
您对图像进行字符串编码的方式是执行以下操作。
BufferedImage img = ImageIO.read(new File("filename.jpg"));
ByteArrayOutputStream baos = new ByteArrayOutputStream();
ImageIO.write(img, "jpg", baos);
baos.flush();
Base64 base = new Base64(false);
String encodedImage = base.encodeToString(baos.toByteArray());
baos.close();
encodedImage = java.net.URLEncoder.encode(encodedImage, "ISO-8859-1");
祝你好运
答案 2 :(得分:2)
我在AsyncTask中使用此代码:
@Override
protected String doInBackground(String... str) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
String encodedImage = bitmapToString(mBitmap);
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("data", encodedImage));
try {
HttpClient httpclient = new DefaultHttpClient();
HttpPost httppost = new HttpPost(
"http://192.168.0.107:8300/upload/upload");
httppost.setEntity(new UrlEncodedFormEntity(nameValuePairs));
HttpResponse response = httpclient.execute(httppost);
String the_string_response = convertResponseToString(response);
return the_string_response;
} catch (Exception e) {
System.out.println("Error in http connection " + e.toString());
return "error";
}
}
public String bitmapToString(Bitmap bitmap) {
ByteArrayOutputStream baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos);
byte[] b = baos.toByteArray();
String temp = null;
try {
System.gc();
temp = Base64.encodeToString(b, Base64.DEFAULT);
} catch (Exception e) {
e.printStackTrace();
} catch (OutOfMemoryError e) {
baos = new ByteArrayOutputStream();
bitmap.compress(Bitmap.CompressFormat.JPEG, 50, baos);
b = baos.toByteArray();
temp = Base64.encodeToString(b, Base64.DEFAULT);
Log.e("PictureDemo", "Out of memory error catched");
}
return temp;
}
private String convertResponseToString(HttpResponse response)
throws IllegalStateException, IOException {
String res = "";
StringBuffer buffer = new StringBuffer();
inputStream = response.getEntity().getContent();
int contentLength = (int) response.getEntity().getContentLength();
if (contentLength < 0) {
} else {
byte[] data = new byte[512];
int len = 0;
try {
while (-1 != (len = inputStream.read(data))) {
buffer.append(new String(data, 0, len));
}
} catch (IOException e) {
e.printStackTrace();
}
try {
inputStream.close();
} catch (IOException e) {
e.printStackTrace();
}
res = buffer.toString();
}
return res;
}
答案 3 :(得分:1)
您不应该发送图像本身,而是发送可以下载的网址。
否则:
AndroidObject