마스터Q&A 안드로이드는 안드로이드 개발자들의 질문과 답변을 위한 지식 커뮤니티 사이트입니다. 안드로이드펍에서 운영하고 있습니다. [사용법, 운영진]

loopj의 android-async-http를 통해 서버로 파일전송 해보신분 계시나요?

0 추천

loopj의 android-async-http를 통해 서버로 파일을 전송하기 기능을 만들어 보았습니다.

근데 파일이 깨져서 이미지 같은게 제대로 보여지지가 않네요 

ㅠ_ㅠ

 

RequestParams params = new RequestParams();
try {
String address = Environment.getExternalStorageDirectory() +  FileName ;
mSendFile = new File(address);
params.put("file", mSendFile);
} catch (Exception e) {
}
AsyncHttpClient client = new AsyncHttpClient();
client.post(mURL_ImgUpload ,params ,new FileAsyncHttpResponseHandler(mSendFile) 
@Override
public void onSuccess(int arg0, Header[] arg1, File arg2) {
 
}
@Override
public void onFailure(int arg0, Header[] arg1, Throwable arg2, File arg3) {
 
}
});
 
이렇게 코딩 했는데 뭐가 문제 일까요 ? ㅠㅠ
 
초록귀신 (760 포인트) 님이 2014년 9월 11일 질문

1개의 답변

0 추천

Environment.getExternalStorageDirectory() +  FileName; 에 파일 경로를 로그로 찍어보세요.. ㅎㅎ;

혹시 

Environment.getExternalStorageDirectory() + "/" +  FileName; 해야 하는건 아닐지... 

Yong-Yong (3,500 포인트) 님이 2014년 9월 11일 답변
그문제는 아니에요 ㅎ
ㅠㅅㅠ
미치겠네요 ㅎ
Multipart 를 쓰면 파일명이 UTF-8로 변환이 안되서 다 깨져 나오거나
아예 전송이 안되고
loopj의 android-async-http를 사용하면 다 잘되는데 파일이 깨져서 이미지나 노래가 제대로 안나오고
ㅠ_ㅠ
private class AsyncFileThread extends Thread {
    String address;
    File file;
    public AsyncFileThread(String addr, File _file){
        address = addr;
        file = _file;
    }
     
    public void run(){
        httpclient = new DefaultHttpClient();
        try {
             
            HttpPost post = new HttpPost(address);
            //헤더 설정
            post.setHeader("Connection", "Keep-Alive");
            post.setHeader("Accept-Charset", "UTF-8");
            post.setHeader("ENCTYPE", "multipart/form-data");
            //멀티파트 엔티티 생성, 파일 이름이 한글일 경우 Charset을 정하는 게 좋음
            MultipartEntity multipartContent =
                new MultipartEntity(HttpMultipartMode.BROWSER_COMPATIBLE,
                null, Charset.forName("UTF-8"));
            //파일 붙임
            FileBody cbFile = new FileBody(file);
            multipartContent.addPart("file1", cbFile);
            //파라메터
            for(NameValuePair nvp:nameValues){
                multipartContent.addPart(nvp.getName(),
                new StringBody(URLEncoder.encode(nvp.getValue(), HTTP.UTF_8)));
            }
            //파일 사이즈
            multipartContent.addPart("fileSize", new StringBody(String.valueOf(file.length())));
            //HttpPost Entity에 연결
            post.setEntity(multipartContent);
             
            //10초 응답시간 타임아웃 설정
            HttpParams params = httpclient.getParams();
            params.setParameter(CoreProtocolPNames.PROTOCOL_VERSION, HttpVersion.HTTP_1_1);
            HttpConnectionParams.setConnectionTimeout(params, 10000);
            HttpConnectionParams.setSoTimeout(params, 10000);
             
            //org.apache.http.client.HttpClient 로 실행
            httpclient.execute(post, responseHandler);
             
        } catch (ConnectTimeoutException e){
            // 타임 아웃 연결 에러시
            Message message = resultHandler.obtainMessage();
            Bundle bundle = new Bundle();
            bundle.putString(RESULT, TIMEOUT_RESULT);
            message.setData(bundle);
            resultHandler.sendMessage(message);
            stringData = e.toString();
             
         }  catch (Exception  e){
             // 기타 오류시
            Message message = resultHandler.obtainMessage();
            Bundle bundle = new Bundle();
            bundle.putString(RESULT, ERROR_RESULT);
            message.setData(bundle);
            resultHandler.sendMessage(message);
            stringData = e.toString();
        } finally {
            httpclient.getConnectionManager().shutdown();
        }
    }
}


참고가 되실지 모르겠네요
doridori2013@nate.com
...