2016-09-21 2 views
1

base64-string으로 인코딩하여 DB 함으로 이미지를 업로드하고 싶습니다.android studio에서 내 BufferedWriter가 닫히지 않는다고 말하는 이유는 무엇입니까?

이미지가 있고 "업로드"버튼을 누르면 내 코드가이를 수행합니다.

private void upLoadPicture() 
{ 
    class UploadImage extends AsyncTask<Bitmap,Void,String> 
    { 
     //ProgressDialog loading; 
     @Override 
     protected String doInBackground(Bitmap... args) { 
      RequestHandler rh = new RequestHandler(); 
      Bitmap tempBitmap = args[0]; 
      String tempImageString = ConvertBitMapToString(tempBitmap); 
      HashMap<String,String> map = new HashMap<String,String>(); 
      map.put(UPLOAD_KEY, tempImageString); 
      rh.SendPostRequest(DATABASE_REQUEST_PATH, map); 
      return null; 
     } 

     @Override 
     protected void onPreExecute() { 
      super.onPreExecute(); 
      // loading = ProgressDialog.show(getApplicationContext(), "Uploading Image", "Please wait", true,true); 
     } 

     @Override 
     protected void onPostExecute(String s) { 
      super.onPostExecute(s); 
     // loading.dismiss(); 
     } 
    } 

    UploadImage Upi = new UploadImage(); 
    Upi.execute(bitmap); 
} 

그리고 여기이 클래스에서 업로드

public class RequestHandler { 

public void SendPostRequest(String url, HashMap<String,String> map) 
{ 
    String tempMessage,a = ""; 
    HashMap<String,String> ImageHashmap = map; 
    try { 
     URL sendmeurl = new URL(url); 
     HttpURLConnection con = (HttpURLConnection) sendmeurl.openConnection(); 

     con.setRequestMethod("POST"); 
     con.setDoOutput(true); 
     con.setDoInput(true); 

     OutputStream os = con.getOutputStream(); 
     InputStream is = con.getInputStream(); 

     BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 

     bw.write(GetPOSTURL(ImageHashmap)); 
     bw.flush(); 
     bw.close(); 

     BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
     while ((tempMessage = br.readLine()) != null){ 
      a = tempMessage; 
     } 
     Log.d("recieve", a); 
     con.disconnect(); 
    } catch (Exception e){ 
     e.printStackTrace(); 
    } 
} 

private String GetPOSTURL(HashMap<String,String> MapPOST) 
{ 
    StringBuilder result = new StringBuilder(); 
    boolean first = true; 
    for (Map.Entry<String, String> entry : MapPOST.entrySet()) { 
     if (first) 
      first = false; 
     else 
      result.append("&"); 

     try { 
      result.append(URLEncoder.encode(entry.getKey(), "UTF-8")); 
      result.append("="); 
      result.append(URLEncoder.encode(entry.getValue(), "UTF-8")); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 

    return result.toString(); 
} 

을 처리해야

/*We store the picture in the database as a encoded 64-Base String so we need to encode it first*/ 
protected String ConvertBitMapToString(Bitmap bm) 
{ 
    ByteArrayOutputStream baos = new ByteArrayOutputStream(); 
    bm.compress(Bitmap.CompressFormat.JPEG,100,baos); 
    byte[] b = baos.toByteArray(); 
    String tempString = Base64.encodeToString(b,Base64.DEFAULT); 
    return tempString; 
} 

그리고 내 클래스를 다음 방법과 클래스 내의 BufferedWriter가 닫혀 오류가 있습니다 내 방법 GetPOSTUrl()을 실행하기 전에 왜 그런지 모르겠습니다. 이 문제에 대해 더 깊이 파고 드는 방법을 모르겠습니다. 내가 비트 맵을

@Override 
protected void onActivityResult(int requestCode, int resultCode, Intent data) { 
    super.onActivityResult(requestCode, resultCode, data); 
    if (requestCode == PICK_IMAGE_REQUEST && resultCode == RESULT_OK && data != null) { 
     filepath = data.getData(); 
     try { 
      ActivityCompat.requestPermissions(this, new String[]{Manifest.permission.READ_EXTERNAL_STORAGE},FETCH_PICTURE_REQUEST); 
     } catch (Exception e){ 
      e.printStackTrace(); 
     } 
    } 
} 

@Override 
public void onRequestPermissionsResult(int requestCode, @NonNull String[] permissions, @NonNull int[] grantResults) { 
    switch (requestCode){ 
     case FETCH_PICTURE_REQUEST: 
      if (grantResults[0] == PackageManager.PERMISSION_GRANTED){ 
       try { 
        bitmap = MediaStore.Images.Media.getBitmap(getContentResolver(), filepath); 
        _IV.setImageBitmap(bitmap); 
       } catch(Exception e){ 
        e.printStackTrace(); 
       } 
      } else { 
       Toast.makeText(getApplicationContext(), "No Permission", Toast.LENGTH_SHORT).show(); 
      } 
     break; 
     default: 
      super.onRequestPermissionsResult(requestCode, permissions, grantResults); 
    } 
} 

을받는 방법은 다음과

편집

은 비트 맵은 오늘 같은 문제가 있었다 단지 내 수업

private Uri filepath; 
private Bitmap bitmap; 

답변

1

안에 있습니다. 이 같은 OutputStream에 작성 후 getInputStream();를 호출보십시오 :

... 
con.setRequestMethod("POST"); 
con.setDoOutput(true); 
con.setDoInput(true); 

OutputStream os = con.getOutputStream(); 
BufferedWriter bw = new BufferedWriter(new OutputStreamWriter(os, "UTF-8")); 

bw.write(GetPOSTURL(ImageHashmap)); 
bw.flush(); 
bw.close(); 

InputStream is = con.getInputStream(); 
BufferedReader br = new BufferedReader(new InputStreamReader(is, "UTF-8")); 
while ((tempMessage = br.readLine()) != null){ 
    a = tempMessage; 
} 
... 

나는 이런 일이 왜 전혀 생각이 없다. getInputStream() 어떻게 든 OutputStream 닫는 것 같습니다. 어쩌면 이것은 이전에이 행동을 알아 차리지 못했기 때문에 새로운 Android Studio 2.2와 관련이있을 것입니다.

+0

감사합니다. 이걸로 내 머리를 잃어 가고 있었어. Inputstream이 그런 식으로 행동했는지 전혀 몰랐습니다. – Bojje

관련 문제