[안드로이드] 이미지파일을 String형으로 변환해서 웹으로 보내고 받는 방법
by qkrtndyd | 12.01.16 08:08 | 6,316 hit
갤러리에서 이미지를 주소로 받아와서 화면에 출력하는 것까지는 했습니다.
 
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("rowid", "0"));
 
제가 이런식으로 데이터를 웹 호스팅에 jsp파일로 데이터를 전송하고 있는데요.
 
같은 방식으로 이미지 파일을 묶어서 보내고 싶습니다. 참고로 mysql 테이블의 이미지저장 칼럼도 varchar입니다.
 
String imgPath;
//imgPath의 내용은 /mnt/sdcard/DCIM/.thumbnails/13055425.jpg 이런식으로 들어갑니다.
 
제가 생각한 방식은 비트맵 -> 바이트 -> 스트링 -> 웹전송 -> db저장 순입니다.
 
BitmapFactory.Options bfo = new BitmapFactory.Options();
bfo.inSampleSize = 2; 
Bitmap bm = BitmapFactory.decodeFile(imgPath);
Bitmap resized = Bitmap.createScaledBitmap(bm, 320, 370, true);  //일단 비트맵으로 바꿔서
 
ByteArrayOutputStream stream = new ByteArrayOutputStream();  
resized.compress( CompressFormat.PNG, 100, stream);     
byte[] byteArray = stream.toByteArray();   //바이트로 변환
String pngImage=Base64.encodeToString(byteArray, 0);  //스트링으로 변환
 
이렇게해서
 
ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
nameValuePairs.add(new BasicNameValuePair("image", pngImage));   //웹으로 전송
 
이렇게 하면 웹 호스팅에 DB에 저장은 잘 되긴하는데요
 
이걸 다시 가져와서 쓸때 JSON 스트링 -> 바이트 -> 비트맵 순으로 변환해서 출력하려고 합니다.
 
String result; //JSON 파싱결과
byte[] bloc = Base64.decode(result,0); //바이트로 변환
Bitmap bmp = BitmapFactory.decodeByteArray(bloc, 0, bloc.length);  //비트맵 변환            
ImageView iv = (ImageView)findViewById(R.id.logok);
iv.setImageBitmap(bmp); //이미지 출력
 
이렇게 햇는데 에러는 나지 않지만 전혀 출력이 되지 않습니다 ㅠ
 
비트맵을 무리하게 스트링으로 변환해서 그런가요??ㅠㅠ
 
아이폰쪽과 연동을 해야해서 db에 꼭 varchar형태로 저장을 시키고 싶은데 방법을 찾고 싶습니다~
 
고수님들 꼭좀 도와주세요~~
 
참고 소스파일도 첨부하니 꼭 좀 봐주세요 ㅠ
 
데이터 전송 부분.java
 
public void transPort(){
  
  ByteArrayOutputStream stream = new ByteArrayOutputStream(); 
  resized.compress( CompressFormat.PNG, 100, stream); 
        byte[] byteArray = stream.toByteArray(); 
       

        String pngImage=Base64.encodeToString(byteArray, 0);
       
       
  String table=table_num_et.getText().toString();
  String people=people_num_et.getText().toString();
  String talk3=talk_et.getText().toString();
  httpclient = new DefaultHttpClient();
  String url = "http://dd2012.cafe24.com/insert.jsp";
  InputStream is = null;
  
  try {
   
   ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
   nameValuePairs.add(new BasicNameValuePair("rowid", rowid));
   nameValuePairs.add(new BasicNameValuePair("dbname", dbname));
   nameValuePairs.add(new BasicNameValuePair("dbpass", dbpass));
   nameValuePairs.add(new BasicNameValuePair("tableno", table));
   nameValuePairs.add(new BasicNameValuePair("peopleno", people));
   nameValuePairs.add(new BasicNameValuePair("intro", talk3));
   nameValuePairs.add(new BasicNameValuePair("sex", sexcheck));
   nameValuePairs.add(new BasicNameValuePair("image", pngImage));
 
   HttpParams params = httpclient.getParams();
   HttpConnectionParams.setConnectionTimeout(params, 5000);
   HttpPost httppost = new HttpPost(url);
   UrlEncodedFormEntity entityRequest = new UrlEncodedFormEntity(nameValuePairs, "euc-kr");
   httppost.setEntity(entityRequest);
   HttpResponse response = httpclient.execute(httppost);
   HttpEntity entityResponse = response.getEntity();
   is = entityResponse.getContent();
   BufferedReader reader = new BufferedReader(new InputStreamReader(is, "euc-kr"), 8);
   StringBuilder sb = new StringBuilder();
   String line = null;
   while ((line = reader.readLine()) != null) {
    sb.append(line).append("\n");
   }
   is.close();
   // 인풋스트림 닫음
   result = sb.toString();
 
   table_num_et.setText("");
   people_num_et.setText("");
   talk_et.setText("");
   iv.setImageResource(R.drawable.w_notimage);
      
  } catch (IOException e) {
   e.printStackTrace();
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   httpclient.getConnectionManager().shutdown();
  }
 }
 
받는 부분.java
 InputStream is = null;
 String url = "http://dd2012.cafe24.com/userselectall.jsp";
 HttpClient httpclient = new DefaultHttpClient();
 try {
   ArrayList<NameValuePair> nameValuePairs = new ArrayList<NameValuePair>();
   nameValuePairs.add(new BasicNameValuePair("rowid", "0"));
   nameValuePairs.add(new BasicNameValuePair("sex", "남"));
   nameValuePairs.add(new BasicNameValuePair("dbname", dbname));
   nameValuePairs.add(new BasicNameValuePair("dbpass", dbpass));
 
   HttpParams params = httpclient.getParams();
   HttpConnectionParams.setConnectionTimeout(params, 5000);
   HttpPost httppost = new HttpPost(url);
  UrlEncodedFormEntity entityRequest = new UrlEncodedFormEntity(
     nameValuePairs, "euc-kr");
   httppost.setEntity(entityRequest);
   HttpResponse response = httpclient.execute(httppost);
   HttpEntity entityResponse = response.getEntity();
   is = entityResponse.getContent();
   BufferedReader reader = new BufferedReader(new InputStreamReader(
     is, "euc-kr"), 8);
   StringBuilder sb = new StringBuilder();
   String line = null;
   while ((line = reader.readLine()) != null) {
    sb.append(line).append("");
   }
   is.close();
   result = sb.toString();
   
  } catch (IOException e) {
   e.printStackTrace();
  } catch (Exception e) {
   e.printStackTrace();
  } finally {
   httpclient.getConnectionManager().shutdown();
  }
  try{ //파싱
   
   String a5="";
   String Json=result;
   Json+="{\"tableno\":\"tt\", \"peopleno\":\"kk\", \"intro\":\"ss\", \"image\":\"ss\"}]";
   JSONArray ja=new JSONArray(Json);
   int i;
   String ln[]=new String[ja.length()-1];
   for(i=0;i<ja.length()-1;i++){
    
    JSONObject order=ja.getJSONObject(i);
    a5=order.getString("image");
    ln[i]=a5;
    
   }
   result=ln[0]; //첫번째 저장 부분만 이미지출력을 보고 싶어서 일단 이렇게 했습니다.
   byte[] bloc = Base64.decode(result,0);
   Bitmap bmp = BitmapFactory.decodeByteArray(bloc, 0, bloc.length);
   ImageView iv = (ImageView)findViewById(R.id.logok);
   iv.setImageBitmap(bmp);   
  
  }catch(JSONException e){
   e.printStackTrace();
  }
 
꼭 좀 부탁드립니다!! 포인트는 260포인트 밖에 없내요 ㅠ
질문자가 자신의 포인트 260 점을 걸었습니다.
답변하시면 포인트 10을, 답변이 채택되면 포인트 208을 드립니다.
질문답변 게시판에서 궁금한 사항을 해결하셨다면, 애써 답변해주신 분께 잘 되었다고 따뜻한 댓글 한마디 남겨주세요.
그리고 답변해주신 분의 글을 '추천' 해주세요.
추천받으신 분에게 1포인트가, 추천하신 분에게도 1포인트가 적립됩니다. ^^

by 나라라붕붕 2012.01.16 09:19
이미지를 byte로 변환후 다시 스트링으로 변환해도 원래 이미지로는 복구 되지가 안습니다.
왜안되는지는 저도 확인해보지 않아서 정확히는 몰르겠으나
이미지를 서버에 저장한다고 하신다면 DB에 이미지를 바로저장하는게 아니라
이미지는 서버에 따로 저장하고 DB에는 이미지가 저장된 서버의 경로를 저장해 놓으시는게 좋은거 같습니다.
이미지 업로드는 multipartrequest라는게 있습니다 .사용법은 검색을 해보시면 쉽게 따라 하 실 수있으실 겁니다.
추천 0 반대 0
by o키라o 2012.01.16 10:53
json이나 소켓같은거 쓰면 되지 않을까여??
추천 0 반대 0
by darkbumbum 2013.01.10 14:41
바이트로 만들어서 이미지로 복구 됩니다
저도
file -> bitmap -> byte[] -> String -> Base64 -> 서버

이런식으로 하긴합니다.

변환된 값을 db에 바로 저장하기 위해서인데.. 이렇게 하는 이유는-_-
mssql image type으로 저장하기 때문에 이렇게 작업하고 있습니다..아주 좋지 못하더라구요

뭐.. 아무튼

그런데 이상한건 웹에선 모두 출력이 됩니다.

하지만-_- 안드로이드에서 출력을 하니 출력되는것도 있고 안되는것도 있습니다..

ㅋㅋ 그이유는 지금 찾는중입니다..

json은 단순히 문서 형태 아닌가요? -0- 문자열로 던진다면 껍떼기야 무엇을 쓰셔도..

몰라서 던진말임..
추천 0 반대 0
by darkbumbum 2013.01.10 14:44
참 multipartrequest으로 파일과 파일이외의 데이터를 같이 던지는거좀 가르쳐주세요-_- 붕붕님 그거하다가 안되서 포기함..
추천 0 반대 0
안드로이드사이드 PC버전 로그인