ABOUT ME

-

Today
-
Yesterday
-
Total
-
  • 폰에서 웹서버로 파일 전송 하는 방법
    안드로이드/학습&강좌 2011. 5. 15. 04:21

    AccountActivity.java

    ProfileJoinAction.java

    ProfileJoinForm.jsp


     예전에 폰에서 웹으로 Data 보내는방법 <POST> 의 강좌를 한적이 있다.  이부분에 대해 한 분의 구독자 분께서 열심히

    연구 하시는 듯 하여 급하게 폰에서 웹서버로 파일을 전송하는 방법에 대해 설명 하도록 하겠다.

    최근 나의 근황을 보자면, 너무 바쁘다 집에 올 시간도 없을 뿐더러, 주 7일중에 6일 근무를 기본으로, 9시 까지 출근에 평균

    퇴근 시간은 am 2:00 시 이후이다. 서비스 오픈이 일주일 남았기 때문에 살인적인 일정을 소화 하는 형편이다.

    머 이상 넋두리 였고, 앞으로 개발자가 되고자 한다면 이런 현실을 알았으면 해서 푸념을 늘어 놓았다. ㅠ_ㅠ

    폰에서 서버로 파일을 전송하는 방법은 이전에 Data를 보내는 방법과 별반 차이는 없다. 서버쪽에서 되려 작업을 해줘야 하는

    게 더 많을 것이다. 앞서 말했듯이 이 블로그는 안드로이드에 대해 연재 하기 위해서 꾸며 졌기 때문에 따른 웹 부분의 소스는

    생략하도록 하겠다. 나중에 웹부분은 따로 연재를 하던가 하겠다. 나역시 웹은 잘 모른다. 기초적인것 이외에;;

    이전에 Data를 웹으로 보낼때의 소스를 보자면 

     

    * @Method 설명 : 입력한 내용을 POST 방식으로 Struts2 Action 으로 보냄~
      */
     private boolean insertAction() {
      // pop에서 입력한 내용을 POST 방식으로 Struts2 Action 으로 보냄~
      try {
       HttpClient client = new DefaultHttpClient();
       String postURL = NootoURL.URL+ResultConst.PROFILEHIWORDUPDATE;
       HttpPost post = new HttpPost(postURL);
       List params = new ArrayList(); // 부모글에 댓글을 달기위한 파라미터 들 ~
       params.add(new BasicNameValuePair("prof_num", MyProfileDTO.getProf_num()));
       params.add(new BasicNameValuePair("prof_hiword", update_hiword.getText().toString()));
       UrlEncodedFormEntity ent = new UrlEncodedFormEntity(params,
         HTTP.UTF_8);
       post.setEntity(ent);
       HttpResponse responsePOST = client.execute(post);

       HttpEntity resEntity = responsePOST.getEntity();
       Toast.makeText(this, "수정했습니다. 재로그인시 반영됩니다.", 2000).show();
       if (resEntity != null) {

        Log.w("RESPONSE", EntityUtils.toString(resEntity));
       }

      } catch (Exception e) {
       Toast.makeText(this, "네트워크 오류로 글등록에 실패하였습니다.", 2000).show();
       e.printStackTrace();
       return false;
      }
      closeContextMenu();
      return true;
     }



    이런식이다 . String postURL = NootoURL.URL+ResultConst.PROFILEHIWORDUPDATE;  이 부분이 주소에서의 처리를 풀어

    보자면 public static final String PROFILEHIWORDUPDATE = "/NootoTalk/profilehiwordUpdate.action"; 이런식이 된다.

    이 말인즉 서버의 주소가 http://localhost:8080/NootoTalk/profilehiwordUpdate.action 이런식으로 구성 된다고 보면 된다.

    이 주소에서 하는일은 말그대로 struts spring 서블릿(영어 모르겠네;;) 이 처리 하는 작업에 대해 호출을 해 주는 식이다.

    데이터만 보내주면 파라미터의 값들이 일치 하게 되면 웹서버가 알아서 처리 하는 구조라고 할 수 있겠다. < 보통의 웹서버와

    의 통신은 이렇다. 자료만 보내주면 땡이다. 클라이언트 단말 부분에서는 그 데이터를 보내고 받기만 하면 된다. >

    이제 서버에 파일을 보내는 구조에 대해 살펴 보자.

    지금 만들려고 하는 구조를 예를 들어 설명 하자면 어느 사이트에 회원 가입을 할때 입력정보를 입력하고 자신의 프로필을

    등록할 수 있는 일반적인 sns 가입 구조 패턴이라 생각 하자, 사용자는 자신의 사진을 폰에 저장되있는걸 찾아서 입력하고, 그

    외에 자신의 프로필 이름 나이 주소 등등 을 입력하는 구조이다.


    단말에서의 입력 화면을 보자~


    이런식의 구조이다. 화면을 클릭하면 단말내 갤러리로 이동해서 이미지를 클릭하며 화면이 바뀔 것이다.

    사진을 넣을을때 화면~



    이런 화면이 될 것이고 가입을 하게 되면,

    서버측의 화면도 추가 하겠다..

     



    붉은 테두리에 서버쪽에 화면에 추가된 내용을 볼 수 있다.

    여기서 설명하고 있는 소스는 C2DM 을 이용한 sns 서비스이다. 간단히 설명 하자면 서드파티션 서버로 로컬 서버를 이용 해서
    데이터를 저장해서 단말간 메시지 통신을 하는 구조이다. 간단한 네이버 톡이라 생각 해도 무방하다.

    이부분에 대해선 나중에 연재 하도록 하겠다. 지금 주 강의는 파일 전송이니 ...

    파일을 전송하는 부분은 이렇게 보내면 된다.

    /**
      * Account.
      *
      * @return the string
      */
     private String account(){
      String accounts="";
      try {
      파일을 얻어와서 생성해서 URL 에 태운다.
       File file = new File(imgPath);
       HttpClient httpclient = new DefaultHttpClient();
       httpclient.getParams().setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);

       HttpPost httppost = new HttpPost(NootoURL.URL+ ResultConst.PROFILEJOIN);
       MultipartEntity mpEntity = new MultipartEntity();
      이부분의 설정으로 파일을 보낸다.
       ContentBody cbFile = new FileBody(file, "image/jpeg");
       mpEntity.addPart("doc", cbFile);  서버에서 처리해주는 파일이름이 doc 이 되겠고, 내가 보내는 파일이 cbFile이다.
       
       //차후 수정 서버 부분 수정
       mpEntity.addPart("prof_id", new StringBody("abcd"));
       mpEntity.addPart("prof_password", new StringBody(prof_password.getText().toString()));
       mpEntity.addPart("prof_name", new StringBody(prof_name.getText().toString()));
       mpEntity.addPart("prof_age", new StringBody(prof_birth.getText().toString()));
       mpEntity.addPart("prof_hiword", new StringBody(prof_hiword.getText().toString()));
       mpEntity.addPart("prof_phone", new StringBody(prof_phone));
       mpEntity.addPart("prof_device", new StringBody(NootoGlobal.getProductID()));

       httppost.setEntity(mpEntity);
       HttpResponse response = httpclient.execute(httppost);
       HttpEntity resEntity = response.getEntity();
       /*
       */
       
       String responseData = EntityUtils.toString(resEntity).toString(); // XML문서 읽기
       
       Log.d("nootok", "리스폰스" + responseData);
       DocumentBuilderFactory factory = DocumentBuilderFactory.newInstance();
       DocumentBuilder builder = factory.newDocumentBuilder();
       Document document = builder.parse(new InputSource(new StringReader(responseData)));
       
       NodeList account = document.getElementsByTagName("account");
       
       accounts = account.item(0).getFirstChild().getNodeValue();
       if(accounts.equals("S"))
       {
    //    Toast.makeText(this, "가입성공", Toast.LENGTH_SHORT).show();
        Log.d("nootok", "성공");
        
       }
       else
       {
    //    Toast.makeText(this, "가입실패", Toast.LENGTH_SHORT).show();
        Log.d("nootok", "실패");
       }
       
       if (resEntity != null) {
       }
       httpclient.getConnectionManager().shutdown();
      } catch (Exception e) {
    //   Toast.makeText(this, "네트워크 오류로 글등록에 실패하였습니다.", 2000).show();
       e.printStackTrace();
      }
      
      return accounts;
     }



    이부분에 대해선 나중에 더 자세히 다룰것이다. 지금 급히 글을 올리는건 고민하고 계신 한분을 위해서일 뿐이다.

    오픈 준비중인 프로젝트 서비스를 시작하고나서 어느정도 여유가 생기게 되면 이 프로젝트의 풀소스를 분석해 보도록 하자.

    C2DM 에 대해서 알아 볼겸(이미 여러군데에서 c2dm을 다루고 있긴 하나 실질적인 내용을 다루진 않으니 다뤄볼 생각이다.)

    마지막으로 가입된 내용의 화면을 보여주자면~


    연습삼아 카카오톡 따라 만든 부분이고, 저작권도 나한테 있으므로 공개 공개~~

    그리고 폰에서 파일을 전송하기 위해선 두개의 jar 파일이 필요 하므로 첨부하도록 하겠다.

    apache-mime4j-0.6.jar

    httpmime-4.0.3.jar


    댓글

COPYRIGHT 2010 EpoNg. ALL RIGHTS RESERVED.