2013-04-10 98 views
1

我在ASP.net中创建了一个RESTful的web服务。从Android应用程序我想要消费这些服务。基本上我使用Android的默认库发送请求并获得JSON响应。无法通过JSON发送base64字符串图像到asp.net web服务android

这里是我的代码:

public class PostImagesHandler { 
    final static String TAG = "WebHandlerHttpPost"; 
    Context context; 
    ImagesBean imageBean; 

    public String postImagesRequest(String URL, Context context, 
      ImagesBean imgBean) { 
     this.context = context; 
     String result = null; 
     this.imageBean = imgBean; 

     try { 
      HttpPost request = new HttpPost(URL); 
      System.out.println("WHAT IS URL :: " + URL); 
      request.setHeader("Accept", "application/json"); 
      request.setHeader("Content-type", "application/json"); 
      request.addHeader("Cache-Control", "no-cache, no-store, must-revalidate"); // HTTP 1.1. 
      request.addHeader("Pragma", "no-cache"); // HTTP 1.0. 
      request.addHeader("Expires", "0"); // Proxies. 


        Bitmap bm = BitmapFactory.decodeFile("sdcard/dotTest9.jpg"); 
      ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
      bm.compress(Bitmap.CompressFormat.JPEG, 90, baos); 
      byte[] bytes_ = baos.toByteArray(); 

      String image_str = Base64.encodeToString(readFile().getBytes(), 
        Base64.NO_WRAP); 
      appendLog(image_str); 

      JSONStringer userJson = new JSONStringer().object() 
      .key("objPostSectionImages").object().key("ID") 
      .value("1").key("SUB_ID").value("1").key("MainTaskId") 
      .value("1").key("ImageBase64").value(image_str) 
      .key("actualAuditDate").value(getCurrentDateTime()).endObject() 
      endObject(); 


      Log.d(TAG, "SECTION IMAGE STRING :: " + userJson.toString()); 

      StringEntity entity = new StringEntity(userJson.toString(), "UTF-8"); 
      entity.setContentEncoding(new BasicHeader(HTTP.CONTENT_TYPE, 
        "application/json")); 
      entity.setContentType("application/json"); 
      request.setEntity(entity); 

      HttpParams params = new BasicHttpParams(); 
      HttpConnectionParams.setConnectionTimeout(params, 30000); 
      HttpConnectionParams.setSoTimeout(params, 10000); 

      // Send request to WCF service 
      DefaultHttpClient httpClient = new DefaultHttpClient(); 
      HttpResponse response = httpClient.execute(request); 

      if (response != null) { 
       StringBuilder sb = new StringBuilder(); 
       BufferedReader rd = new BufferedReader(new InputStreamReader(
         response.getEntity().getContent())); 

       String line; 
       while ((line = rd.readLine()) != null) { 
        sb.append(line + "\n"); 
       } 

       result = sb.toString(); 
       Log.d(TAG, "AUDIT SECTION IMAGES Response: " + result); 
      } 
     } catch (Exception e) { 
      e.printStackTrace(); 
     } 
     return result; 
    } 

    public void appendLog(String text) { 
     File logFile = new File("sdcard/dotTest7.txt"); 
     if (!logFile.exists()) { 
      try { 
       logFile.createNewFile(); 
      } catch (IOException e) { 
       // TODO Auto-generated catch block 
       e.printStackTrace(); 
      } 
     } 
     try { 
      // BufferedWriter for performance, true to set append to file flag 
      BufferedWriter buf = new BufferedWriter(new FileWriter(logFile, 
        true)); 
      buf.append(text); 
      // buf.newLine(); 
      buf.close(); 
     } catch (IOException e) { 
      // TODO Auto-generated catch block 
      e.printStackTrace(); 
     } 
    } 

    @SuppressLint("SimpleDateFormat") 
    public static String getCurrentDateTime() { 
     return new SimpleDateFormat("MM-dd-yyyy").format(Calendar.getInstance() 
       .getTime()); 
    } 
} 

我能够这样送小图像,但同时发送大量图像(超过500 KB),我面临的问题。有时我会收到“请求错误”,有时会起作用。

+0

是否有任何理由不应该将图像流式传输到服务而不是转换为Base64字符串? – 2013-04-10 13:31:04

+0

我正在创建一个json对象,并且base64是该对象的一个​​参数。然后将此对象传递给基于REST的WCF。 WCF需要base64字符串。 – Mohanish 2013-04-10 13:51:10

+0

你可以使用[multipart上传](http://stackoverflow.com/questions/1354749/wcf-service-to-accept-a-post-encoded-multipart-form-data) – 2013-04-10 13:53:41

回答

0

也许您的ASP.NET webservice在base64字符串中转义正斜杠?这使得这些数据从正常应用程序的角度来分解。

在小图像中得到/符号后base64转换的概率明显低于大的一个,所以你得到这个随机错误的情况。

您可以检查您的服务产生的字符串为/\符号,并将它们替换为/并检查它是否工作。

相关问题