无法通过JSON发送base64字符串图像到asp.net web服务android
问题描述:
我在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),我面临的问题。有时我会收到“请求错误”,有时会起作用。
答
也许您的ASP.NET webservice在base64
字符串中转义正斜杠?这使得这些数据从正常应用程序的角度来分解。
在小图像中得到/
符号后base64
转换的概率明显低于大的一个,所以你得到这个随机错误的情况。
您可以检查您的服务产生的字符串为/\
符号,并将它们替换为/
并检查它是否工作。
是否有任何理由不应该将图像流式传输到服务而不是转换为Base64字符串? – 2013-04-10 13:31:04
我正在创建一个json对象,并且base64是该对象的一个参数。然后将此对象传递给基于REST的WCF。 WCF需要base64字符串。 – Mohanish 2013-04-10 13:51:10
你可以使用[multipart上传](http://stackoverflow.com/questions/1354749/wcf-service-to-accept-a-post-encoded-multipart-form-data) – 2013-04-10 13:53:41