在JSON请求中发送图像

我正在使用带有REST API的JSON来使用Web服务。

现在我还需要在请求中发送图像。 可能吗?

如果是,我需要在客户端/服务器端进行哪些更改。

在我的Java代码中,我应该如何发送图像内容(我是否需要单独设置内容类型)?

这样做的方法是将其作为内容发送到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"); 

祝好运

适用于我的示例应用程序端代码。 您可以在一个valuepair中发送图像,在另一个valuepair中发送json :(此处“uploadedfile”标记将valuepair定义为在post函数检查期间sd卡中图像文件的路径,其他标记将被视为文本数据)

 List values; values = new ArrayList(); 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); 

//后期function

 public void post(final List 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需要添加到项目中

我在AsyncTask中使用此代码:

 @Override protected String doInBackground(String... str) { ByteArrayOutputStream baos = new ByteArrayOutputStream(); mBitmap.compress(Bitmap.CompressFormat.JPEG, 100, baos); String encodedImage = bitmapToString(mBitmap); ArrayList nameValuePairs = new ArrayList(); 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; } 

您不应该发送图像本身,而是可以从中下载它的URL。

除此以外:

  • 你提出的请求太大了
  • 通常你想异步加载图像,这只有在内容与其他数据分开时才能实现。
  • 你很可能无法使用自动JSON解析库,如GSON,Jackson,或集成在Adnroid SDK AndroidObject