2011-09-06 5 views
3

내 안드로이드 앱에서 이미지 나 큰 파일을 업로드하려고하면 OutOfMemoryException으로 인해 충돌합니다. 이 일을하는 다른 방법이 있는지 궁금해합니다. base64로 문자열이 nameValuPairs 컬렉션에서 값 중 하나 여기android에서 파일을 게시 할 때 메모리 문제가 발생했습니다.

Base64.encodeToString(bytes, Base64.DEFAULT); 

그리고 :

필자는 응용 프로그램의 두 개의 서로 다른 지점에서 충돌이 있었다.

HttpClient client = new DefaultHttpClient(); 
HttpPost httppost = new HttpPost(uo.WebServiceURL); 
UrlEncodedFormEntity entity = new UrlEncodedFormEntity(nameValuePairs); // On this line 
httppost.setEntity(entity); 
HttpResponse response = client.execute(httppost); 

아이디어가 있으십니까?

답변

6

이렇게하면 전체 POST를 메모리에 버퍼링해야합니다. 먼저 Content-Length 헤더를 보내야하기 때문입니다.

대신에 http://developer.android.com/reference/org/apache/http/entity/FileEntity.html 을 포함하여 Apache HTTP 라이브러리를 사용하고 싶다고 생각합니다. 그러면 파일을 읽기 전에 길이를 알아낼 수 있습니다. 이 답을 시작점으로 사용할 수 있습니다. 그러나 의 두 번째 매개 변수 인 FileEntity 생성자는 MIME 유형 (예 : image/png, 텍스트/HTML 등)이어야합니다.

Posting a large file in Android

확인이 또한

......... Schnapple으로

귀하의 질문은 매우 광범위 보인다 읽고 이해하기 혼란 말한다.

다음은 HTTP POST를 보내고 서버로부터 응답을받는 일반적인 코드입니다. 도움이 될 수 있습니다.

public String postPage(String url, File data, boolean returnAddr) { 

    ret = null; 

    httpClient.getParams().setParameter(ClientPNames.COOKIE_POLICY, CookiePolicy.RFC_2109); 

    httpPost = new HttpPost(url); 
    response = null; 

    FileEntity tmp = null;  

    tmp = new FileEntity(data,"UTF-8"); 

    httpPost.setEntity(tmp); 

    try { 
     response = httpClient.execute(httpPost,localContext); 
    } catch (ClientProtocolException e) { 
     System.out.println("HTTPHelp : ClientProtocolException : "+e); 
    } catch (IOException e) { 
     System.out.println("HTTPHelp : IOException : "+e); 
    } 
      ret = response.getStatusLine().toString(); 

      return ret; 
} 
+0

Thx가 해당 라이브러리를 조사합니다. – twDuke

관련 문제