본문 바로가기

Development/Android

안드로이드 또는 아이폰에서 서버로 파일을 올릴때 리턴값(스트링)을 받아오기.

안드로이드, 아이폰에서 서버로 httpClient 를 이용해서 그림파일을 보내고 그 결과값을 받아와야 할 일이 생겼다.
스트링으로 받아오려면 프레임웤에 REST 를 올려서 json 으로 받는게 가장 심플하고 좋겠지만 낼모레 테스트하는 마당에 그러기엔 너무 귀찮고.. 해서 약간 꼼수를 썼다.

서버의 컨트롤러 메소드에서 ModelAndView 를 리턴할때 jsp 페이지를 하나 만들어 두고 그 jsp 페이지에 리턴할 내용만 넘겨주면 된다. 아주 심플하다.
대신 jsp 페이지의 내용엔 오로지 리턴받기 원하는 string 만 들어가야 한다.

예를 들면,

안드로이드에서  

 ByteArrayOutputStream bos = new ByteArrayOutputStream();

 
signature.compress(Bitmap.CompressFormat.PNG, 100, bos);
 
String fileName = phoneNo + "_signature" + ".png";
 
String resultString = "";
 
byte[] data = bos.toByteArray();
 
HttpClient httpClient = new DefaultHttpClient();
HttpPost postRequest = new HttpPost(URL_ADDRESS + "/registerConfirm.do");
 
ByteArrayBody bab = new ByteArrayBody(data, fileName);
 
MultipartEntity reqEntity = new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE);
 
Log.e(TAG, "idx             : " + idx);
Log.e(TAG, "nextTarget      : " + nextTarget);
Log.e(TAG, "organizationId  : " + organizationId);
Log.e(TAG, "approvalChecked : " + approvalChecked);
Log.e(TAG, "p_Id            : " + id);
Log.e(TAG, "p_DeliveryNo    : " + deliveryNo);
Log.e(TAG, "p_ProductionNo  : " + productionNo);
Log.e(TAG, "p_WaterPress    : " + waterPress);
Log.e(TAG, "p_Signature     : " + bab.getFilename());
 
try {
reqEntity.addPart("idx", new StringBody(idx));
reqEntity.addPart("nextTarget", new StringBody(nextTarget));
reqEntity.addPart("organizationId", new StringBody(organizationId));
reqEntity.addPart("approvalChecked", new StringBody(approvalChecked));
reqEntity.addPart("p_Id", new StringBody(id));
reqEntity.addPart("p_DeliveryNo", new StringBody(deliveryNo));
reqEntity.addPart("p_ProductionNo", new StringBody(productionNo));
reqEntity.addPart("p_WaterPress", new StringBody(waterPress));
reqEntity.addPart("p_Signature", bab);
reqEntity.addPart("browserType", new StringBody("2"));
 
postRequest.setEntity(reqEntity);
HttpResponse response = httpClient.execute(postRequest);
 
HttpEntity resEntity = response.getEntity();
 
resultString = EntityUtils.toString(resEntity);
 
String[] result = resultString.split("/");
 
String resultString1 = result[0]; // 결과 코드
String resultString2 = result[1]; // 2
String resultString3 = result[2]; // 브라우저 타입
 
Log.e(TAG, "resultString1 : " + resultString1);
Log.e(TAG, "resultString2 : " + resultString2);
Log.e(TAG, "resultString3 : " + resultString3);
 
// Log.e(TAG, "resEntity : " + EntityUtils.toString(resEntity));
 
if (resEntity != null) {
resEntity.consumeContent();
}
 
// Server 의 javascript function 에 파라메터를 넘겨 준다.
mWeb.loadUrl("javascript:showProcedureResult(" + resultString1 + ", " + resultString2 + ", " + resultString3 + ");");
} catch (UnsupportedEncodingException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(DongyangView.this, "통신오류가 발생했습니다." + "\n" + "다시 시도해 주세요.", Toast.LENGTH_SHORT).show();
} catch (ClientProtocolException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(DongyangView.this, "통신오류가 발생했습니다." + "\n" + "다시 시도해 주세요.", Toast.LENGTH_SHORT).show();
} catch (IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
Toast.makeText(DongyangView.this, "통신오류가 발생했습니다." + "\n" + "다시 시도해 주세요.", Toast.LENGTH_SHORT).show();
}
 
httpClient.getConnectionManager().shutdown();
}

 


이런 식으로 쐈을때

서버의 컨트롤러 메소드에서는

 
 

 

        ModelAndView mav = new ModelAndView();
        mav.setViewName("registerConfirmResult");
        mav.addObject("result", result);
        mav.addObject("id", id);
        mav.addObject("organizationId", organizationId);
        mav.addObject("approvalChecked", approvalChecked);
        mav.addObject("approvalResultCode", result.getP_ResultCode());
        mav.addObject("nextTarget", "FE_CustomerApproval");
        mav.addObject("idx", idx);
        mav.addObject("browserType", browserType);
        mav.addObject("resultCode", resultCode);
 
        return mav;

 


이렇게 던져주면 된다.

이때  registerConfirmResult.jsp 페이지에는 

 

 

<%
    String resultCode = request.getParameter("resultCode");     // 결과코드
//    String resultName = request.getParameter("resultName");     // 결과명
    String approvalChecked = request.getParameter("");          // 2
    String browserType = request.getParameter("browserType");   // chrome or safari
    
%>
${resultCode}/${approvalChecked}/${browserType}/

 

 

이렇게 정의하면 파일 내용은 클라이언트에 넘겨줄 스트링값으로만 세팅된다.

이 jsp 페이지를 안드로이드가 resultString = EntityUtils.toString(resEntity); 부분에서 스트링으로 받아오고 그 내용에서 필요한 부분들을 "/" 으로 split 해서 끊어서 사용한다.
아주 심플하다. 임시방편으로는..


역시 궁하면 통한다고 했던가.. -_-