본문 바로가기

6. With IT/6.1 Android

파일전송(ftp)


자바는 ftp관련 API정보가 없다. 그래서 인터넷에서 구글링하여 찾아야 한다.


프로젝트하는 도중, ftp 혹은 http를 이용하여 서버에 자료를 업로드하는 일이 생겼다.


그래서 따로 잊어버리지 않게 포스팅을 해둔다.



1. 해당 부분을 구현하기 위해서는 ftp관련 라이브러리를 외부에서 추가해주어야 한다.(첨부파일 참조)

이 때, 해당 프로젝트의 Properties로 들어가 Java Build Path안에 Order and Export부분에서 추가한 

라이브러리를 따로 체크해 주어야 한다.


commons-net-1.4.1.jar


jakarta-oro-2.0.8.jar




2. 구현시, HoneyComb 버전 부터는 UI Thread내에 파일 전송, 혹은 네트워크 전송부분을 사용하게 되면

StrictMode error가 뜰 것이다. 이는 파일과 네트워크 전송시 시간이 delay되는 현상때문에 안드로이드 버전이

올라가면서 더욱더 Strict해진 부분이다. 그러므로 관련 코드 작성시, 이 부분에 대한 처리를 해주어야 한다.

(링크 : http://dev.kthcorp.com/2012/01/31/android-strict-mode-howto/)


<StrictMode...>

public static final boolean SUPPORT_STRICT_MODE = 

Build.VERSION_CODES.FROYO < Build.VERSION.SDK_INT;

...


 public void onCreate(Bundle savedInstanceState) {

   

    // Use StrictMode only if it works as debaggable...

    boolean debaggable = (getApplicationInfo().flags & ApplicationInfo.

    FLAG_DEBUGGABLE) != 0;

       

    if (SUPPORT_STRICT_MODE && debaggable) {

       StrictMode.setThreadPolicy(new StrictMode.ThreadPolicy.Builder()

               .detectAll()

               .penaltyLog()

               .build());

       StrictMode.setVmPolicy(new StrictMode.VmPolicy.Builder()

               .detectAll()

               .penaltyLog()

               .build());

   

   

        super.onCreate(savedInstanceState);

        setContentView(R.layout.activity_main);

...

}



<Ftp Process...>


final String path = "file path...";
FTPClient ftp = null; // FTP Client 객체
FileInputStream fis = null;        // File Input Stream
File uploadfile = new File(path);      // File 객체 
FTPprocess ftpProcess= null;
...

 protected void onResume(){

    super.onResume();

   

        btn.setOnClickListener(new OnClickListener(){

    public void onClick(View v){

   

    // 태스크 실행

    //ftpProcess = (FTPprocess) new FTPprocess().execute((Void) null);

    new FTPprocess().execute((Void) null);

    }

        });

    }


private class FTPprocess extends AsyncTask<Void, Void, Void>{

   

    protected void onPreExecute(){

    // 작업 실행 전, UI 스레드에서 호출. 일반적으로 유저 인터페이스에 

    // 프로그레스바를 보여주는 것 같은 태스크 셋업에 사용.

        }    


    protected Void doInBackground(Void... params){

    // onPreExecute() 실행이 끝나면 백그라운드 스레드에서 즉시 호출됨. 

    // 이 단계는 백그라운드 계산을 수행하는데 사용되고, 시간이 오래걸릴 수 있음. 

    // 비동기 작업의 파라미터(위의 Params)는 이 단계에 전달. 계산 결과는 여기서 

    // 반환해야 하며 마지막 단계로 전달. 하나 또는 더 많은 단위의 프로그레스를 

    // 퍼블리시 하기 위해 publishProgress(Progress...)를 사용할 수 있음. 

    // 이 값들은 onProgressUpdate(Progress...) 단계에서 UI 스레드에 퍼블리시 됨.

   

  try{

    ftp.setControlEncoding("UTF-8");           // 문자 코드를 UTF-8로 인코딩

ftp.connect("xxx.xxx.xxx.xxx");       // 서버접속 " "안에 서버 주소 또는 "서버주소", 포트번호

ftp.login("id", "pw");                             // FTP 로그인 ID, PASSWORLD 입력

ftp.enterLocalPassiveMode();             // Passive Mode 접속일때

ftp.changeWorkingDirectory("/");     // 작업 디렉토리 변경

ftp.setFileType(FTP.BINARY_FILE_TYPE);  // 업로드 파일 타입 셋팅 

try{

fis = new FileInputStream(uploadfile); // 업로드할 File 생성

ftp.storeFile(uploadfile.getName(), fis);     // File 업로드

}catch(IOException ex){

System.out.println("IO Exception : " + ex.getMessage());

}finally{

if (fis != null){

try{

fis.close();         // Stream 닫기

}catch(IOException ex){

System.out.println("IO Exception : " + ex.getMessage());

}

}

}

ftp.logout();    // FTP Log Out

}catch(IOException e){

System.out.println("IO:"+e.getMessage());

}finally{

if (ftp != null && ftp.isConnected()){

try{

ftp.disconnect();        // 접속 끊기

}catch (IOException e){

System.out.println("IO Exception : " + e.getMessage());

}

}

}

  return null;

    }

    

    protected void onProgressUpdate(Integer... progress) {

    // publishProgress(Progress...) 가 호출되고 난 후, UI 스레드에서 호출. 

    // 실행 타이밍은 정의되지 않음. 이 메소드는 백그라운드 계산이 여전히 실행되는 

    // 동안에는 유저인터페이스에 진행 형태를 보여주는데 사용됨. 예를 들면,  

    // 프로그레스바 애니메이션이나, 텍스트 필드에 로그를 보여주는데 사용될 수 있음.

    // ex) setProgressPercent(progress[0]);    

        }


        protected void onPostExecute(Long result) {

        // 백그라운드 계산이 완료되면 UI 스레드에서 호출됨. 백그라운드 계산 결과는 

        // 이 단계에 파라미터로 전달됩니다.

        // ex) showDialog("Downloaded " + result + " bytes");

        }

    } 



onCreat() 부분에서 초기화되는 각종 변수정보는 생략한다.

===================================================================================================================


이 두 부분만 확실히 짚고 넘어간다면 쉽게 진행 할 수 있으리라 본다.




'6. With IT > 6.1 Android' 카테고리의 다른 글

이클립스 플러그인(svn)설치  (0) 2013.02.06
파일전송(웹 서버 : 아파치서버)  (3) 2013.02.05
구글 지도 띄우기  (1) 2013.01.28
sdcard안의 파일 내용 얻기  (0) 2012.02.01
Android 아키첵쳐  (0) 2011.09.30