공상하는 개발자

[안드로이드/android] 이미지 호스팅을 통한 url로 이미지 받아오기 본문

개발/안드로이드

[안드로이드/android] 이미지 호스팅을 통한 url로 이미지 받아오기

공상과학소설 2019. 7. 22. 11:10
반응형

내가 만들 타임라인은 사진이 무엇보다 중요하다. 솔직히 페이스북이나 인스타그램 같은 경우도 사진이 전부다.

그런데 이러한 사진들을 앱상에 집어넣게 되면 용량이 엄청 커지고 받아오는 데에도 시간이 오래 걸려서 다른 방법을 찾다가 이미지 호스팅을 이용해서 이 url을 통해서 이미지를 받아오면 빠르고 간결하게 이미지를 받을 수 있겠다 라는 생각을 하게 되었다. 그래서 이미지 호스팅을 찾는데 거의 다 유료라서 유료를 결제해야 하나 라는 생각에 잠겨있을 때 dothome이라는 유명한 웹호스팅 사이트를 찾게 되었다. 여기서 무료로 도메인을 하나 받고 파일을 ftp을 통해서 올릴 수 있었는데 여기다가 이미지를 올리고 url을 생성해서 받아오겠다는 생각을 하였다. 

 

 

포스트 프레그먼트

 

Fragment_Post.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
public class Fragment_Post extends Fragment{
    private Button add_img,cc;
    private File tempFile;
    private ImageView imageView1;
    private EditText postcontent;
    private static final int PICK_FROM_ALBUM = 1;
    private static String temp="";
    public static String imagepath;
    public static int text;
    public void onCreate(Bundle savedInstanceState) {
 
        super.onCreate(savedInstanceState);
    }
    @Override
    public View onCreateView(LayoutInflater inflater, ViewGroup container,
                             Bundle savedInstanceState) {
        View view = inflater.inflate(R.layout.fragment_post,container,false);
 
        text=whatthe.pref_postnum.getInt("text"0);
 
        imageView1 = view.findViewById(R.id.post_image);
        postcontent=view.findViewById(R.id.post_edit);
        add_img = view.findViewById(R.id.add_img);
        cc=view.findViewById(R.id.cancel);
        add_img.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                goToAlbum();
            }
        });
        cc.setOnClickListener(new View.OnClickListener() {
            @Override
            public void onClick(View view) {
                new Thread() {
                    public void run() {
                        //        ftp 연결
                        try {
                            FTPClient mFTP = new FTPClient();
                            mFTP.connect("112.175.184.74"21);// ftp로 접속
                            mFTP.login("ghkdua1829""gim1855!"); // ftp 로그인 계정/비번
                            mFTP.setFileType(FTP.BINARY_FILE_TYPE); // 바이너리 파일
                            mFTP.setBufferSize(1024 * 1024); // 버퍼 사이즈
                            mFTP.enterLocalPassiveMode();// 패시브 모드로 접속 // 업로드 경로 수정 (선택 사항 )
                            mFTP.cwd("html"); // ftp 상의 업로드 디렉토리
                            mFTP.cwd("files"); // html/files 로 이동 (이 디렉토리로 업로드가 진행)
                            File path = new File(imagepath); // 업로드 할 파일이 있는 경로(예제는 갤러리에서 고른 사진 경로)
                            FileInputStream in=new FileInputStream(path);
 
                            mFTP.storeFile(whatthe.pref_postnum.getInt("text"0)+".png",in);  
                        } catch (SocketException e) { // TODO Auto-generated catch block
                            e.printStackTrace();
                        } catch (IOException e) { // TODO Auto-generated catch block
                            e.printStackTrace(); }
                    }
                }.start();
                insertoToDatabaseContent(postcontent.getText().toString(),"http://아이디.dothome.co.kr/files/"+whatthe.pref_postnum.getInt("text"0)+".png",whatthe.userNickname);
 
            }
        });
        return view;
    }
 
 
    private void goToAlbum() {
        Intent intent = new Intent(Intent.ACTION_PICK);
        intent.setType(MediaStore.Images.Media.CONTENT_TYPE);
        startActivityForResult(intent, PICK_FROM_ALBUM);
    }
    @Override
    public void onActivityResult(int requestCode, int resultCode, Intent data) {
        if (requestCode == PICK_FROM_ALBUM) {
            Uri photoUri = data.getData();
            imagepath=getRealPathFromURI(photoUri);
            Cursor cursor = null;
            try {
                String[] proj = { MediaStore.Images.Media.DATA };
                assert photoUri != null;
                cursor = getContext().getContentResolver().query(photoUri, proj, nullnullnull);
                assert cursor != null;
                int column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
                cursor.moveToFirst();
                tempFile = new File(cursor.getString(column_index));
            } finally {
                if (cursor != null) {
                    cursor.close();
                }
            }
            setImage();
        }
    }
    private String getRealPathFromURI(Uri contentUri) {
        int column_index=0String[] proj = {MediaStore.Images.Media.DATA};
        Cursor cursor = getContext().getContentResolver().query(contentUri, proj, nullnullnull);
        if(cursor.moveToFirst()){
            column_index = cursor.getColumnIndexOrThrow(MediaStore.Images.Media.DATA);
        }
        return cursor.getString(column_index);
    }
 
    private void setImage() {
        BitmapFactory.Options options = new BitmapFactory.Options();
        Bitmap originalBm = BitmapFactory.decodeFile(tempFile.getAbsolutePath(), options);
        BitMapToString(originalBm);
        imageView1.setImageBitmap(originalBm);
    }
 
    public void BitMapToString(Bitmap bitmap){
        ByteArrayOutputStream baos=new  ByteArrayOutputStream();
        bitmap.compress(Bitmap.CompressFormat.PNG,100, baos);    //bitmap compress
        byte [] arr=baos.toByteArray();
        String image= Base64.encodeToString(arr, Base64.DEFAULT);
        try{
            temp="&imagedevice="+ URLEncoder.encode(image,"utf-8");
        }catch (Exception e){
            Log.e("exception",e.toString());
        }catch(OutOfMemoryError e){
            Toast.makeText(getContext(), "이미지 용량이 너무 큽니다.", Toast.LENGTH_SHORT).show();
        }
 
 
    }
    private void insertoToDatabaseContent(String content, String imgurl, String nickname) {
        class InsertData extends AsyncTask<String, Void, String> {
            ProgressDialog loading;
            @Override
            protected void onPreExecute() {
                super.onPreExecute();
                loading = ProgressDialog.show(getContext(), "Please Wait"nulltruetrue);
            }
            @Override
            protected void onPostExecute(String s) {
                super.onPostExecute(s);
                loading.dismiss();
                if(s.equalsIgnoreCase("글이 등록되었습니다.")){
                    SharedPreferences.Editor editor = whatthe.pref_postnum.edit();
                    editor.putInt("text",++text);
                    editor.commit();
                    Intent intent = new Intent(getContext(), whatthe.class);
                    intent.putExtra("userName", whatthe.userNickname);
                    startActivity(intent);
                    getActivity().finish();
                }
                else{
                    AlertDialog.Builder builder=new AlertDialog.Builder(getContext());
                    builder.setMessage(s)
                            .setNegativeButton("retry",null)
                            .create()
                            .show();
                }
            }
            @Override
            protected String doInBackground(String... params) {
 
                try {
                    String Content = (String) params[0];
                    String ImgUrl = (String) params[1];
                    String NickName = (String) params[2];
 
                    String link = "https://eryon.000webhostapp.com/img.php";
                    String data = URLEncoder.encode("Content""UTF-8"+ "=" + URLEncoder.encode(Content, "UTF-8");
                    data += "&" + URLEncoder.encode("ImgUrl""UTF-8"+ "=" + URLEncoder.encode(ImgUrl, "UTF-8");
                    data += "&" + URLEncoder.encode("NickName""UTF-8"+ "=" + URLEncoder.encode(NickName, "UTF-8");
 
                    URL url = new URL(link);
                    URLConnection conn = url.openConnection();
 
                    conn.setDoOutput(true);
                    OutputStreamWriter wr = new OutputStreamWriter(conn.getOutputStream());
 
                    wr.write(data);
                    wr.flush();
 
                    BufferedReader reader = new BufferedReader(new InputStreamReader(conn.getInputStream()));
 
                    StringBuilder sb = new StringBuilder();
                    String line = null;
 
                    // Read Server Response
                    while ((line = reader.readLine()) != null) {
                        sb.append(line);
                        break;
                    }
                    return sb.toString();
                } catch (Exception e) {
                    return new String("Exception: " + e.getMessage());
                }
            }
        }
        InsertData task = new InsertData();
        task.execute(content, imgurl, nickname);
    }
 
}
 
 
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

위코드를 설명하자면

1. 갤러리에 들어가서 사진을 받아온다.

2. 글을 적고 작성을 누르면 이미지를 ftp를 통해 url로 보낸다.

3. 글의 내용과 사진의 url을 데이터베이스로 보내서 삽입시킨다.

 

 

다음은 이 데이터베이스의 이미지를 url을 통하여 보여주는 방법이다.

리사이클 러뷰를 사용해서 리스트 형태로 뿌려주기 위해서 adapter를 구성하였다.

 

 

SimpleTextAdapter.java

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
public class SimpleTextAdapter extends RecyclerView.Adapter<SimpleTextAdapter.ViewHolder> {
 
    private ArrayList<Item> mData = null ;
 
 
 
    // 아이템 뷰를 저장하는 뷰홀더 클래스.
    public class ViewHolder extends RecyclerView.ViewHolder {
        TextView textView1 ;
        private ImageView imageView_img,imageView_img2;
        private TextView textView_day, textView_name, texView_text, texView_jot,texView_dat;
 
        ViewHolder(View itemView) {
            super(itemView) ;
            imageView_img = (ImageView) itemView.findViewById(R.id.imageView_img);
            imageView_img2 = (ImageView) itemView.findViewById(R.id.imageView_img2);
 
            textView_name = (TextView) itemView.findViewById(R.id.textView_name);
            textView_day = (TextView) itemView.findViewById(R.id.textView_day);
            texView_text = (TextView) itemView.findViewById(R.id.textView_text);
            texView_jot = (TextView) itemView.findViewById(R.id.textView_jot);
            texView_dat = (TextView) itemView.findViewById(R.id.textView_dat);
 
        }
    }
 
    // 생성자에서 데이터 리스트 객체를 전달받음.
    SimpleTextAdapter(ArrayList<Item> list) {
        mData = list ;
    }
 
    // onCreateViewHolder() - 아이템 뷰를 위한 뷰홀더 객체 생성하여 리턴.
    @Override
    public SimpleTextAdapter.ViewHolder onCreateViewHolder(ViewGroup parent, int viewType) {
        Context context = parent.getContext() ;
        LayoutInflater inflater = (LayoutInflater) context.getSystemService(Context.LAYOUT_INFLATER_SERVICE) ;
 
        View view = inflater.inflate(R.layout.recyclerview_item, parent, false) ;
        SimpleTextAdapter.ViewHolder vh = new SimpleTextAdapter.ViewHolder(view) ;
 
        return vh ;
    }
 
    // onBindViewHolder() - position에 해당하는 데이터를 뷰홀더의 아이템뷰에 표시.
    @Override
    public void onBindViewHolder(SimpleTextAdapter.ViewHolder holder, int position) {
 
        String imageUrl = mData.get(position).getImg_url();
        holder.textView_day.setText(String.valueOf(mData.get(position).getName()));
        holder.textView_name.setText(String.valueOf(mData.get(position).getDay()));
        holder.texView_text.setText(String.valueOf(mData.get(position).getText()));
        holder.texView_jot.setText(String.valueOf(mData.get(position).getJot()));
        holder.texView_dat.setText(String.valueOf(mData.get(position).getDat()));
 
    }
 
    // getItemCount() - 전체 데이터 갯수 리턴.
    @Override
    public int getItemCount() {
        return mData.size() ;
    }
}
http://colorscripter.com/info#e" target="_blank" style="color:#4f4f4ftext-decoration:none">Colored by Color Scripter

 

 

나는 이미지를 Glide 라이브러리를 사용해서 간단하게 구현하였다. Glide 라이브러리를 사용하려면 넣어주어야 할 구문들이 있는데 구글에 찾아보면 많이 나오니까 생략하도록 하겠다.

 

이런 식으로 잘 구현되는 것을 볼 수 있다.

반응형
Comments