안드로이드

안드로이드에서 jsp로 이미지 전송 및 저장 / 이미지 URL로 안드로이드에 이미지 가져오기

알통몬_ 2017. 4. 10. 08:17
반응형


안녕하세요 알통몬입니다.

공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!!

포스팅 내용이 찾아주신 분들께 도움이 되길 바라며

더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^

 

오랜만에 안드로이드 포스팅을 하는데요.

안드로이드에서 jsp로 이미지 전송 후 저장하는 거까지 해보겠씁니다.


먼저 이미지를 선택해야겠죠?

갤러리에서 이미지를 가져오는 예제는 구글링하면 많이 나오니 이미지를 선택했다고

가정하고 예제를 보겠습니다.

예제)

안드로이드에서는 업로드할 기능을 실행하는 jsp url과 안드로이드 이미지만

제대로 가져온다면 에러가  발생하거나 할 부분은 없습니다.


갤러리에서 이미지를 가져오게 되면 보통 실제 경로가 아닌 storage/123129831293.jpg 이런

형식의 이름으로 가져오게 되는데요.  아래 메소드를 사용하게 되면 실제 경로를 가져올 수 있습니다.

public String getRealPathFromURI(Uri contentUri) {

        String res = null;

        String[] proj = {MediaStore.Images.Media.DATA};

        Cursor cursor = activity.getContentResolver().query(contentUri, proj, null, null, null);

        if (cursor.moveToFirst()) {

            int column_index = cursor.getColumnIndex(MediaStore.Images.Media.DATA);

            res = cursor.getString(column_index);

        }

        cursor.close();

        return res;

    }



// 여기서부터가 jsp 이미지를 보내는 코드입니다.

public void DoFileUpload(String apiUrl, String absolutePath) {

        HttpFileUpload(apiUrl, "", absolutePath);

    }


    public void HttpFileUpload(String urlString, String params, String fileName) {


        String lineEnd = "\r\n";

        String twoHyphens = "--";

        String boundary = "*****";

        try {

            File sourceFile = new File(fileName);

            DataOutputStream dos;

            if (!sourceFile.isFile()) {

                Log.e("uploadFile", "Source File not exist :" + fileName);

            } else {

                FileInputStream mFileInputStream = new FileInputStream(sourceFile);

                URL connectUrl = new URL(urlString);

                // open connection

                HttpURLConnection conn = (HttpURLConnection) connectUrl.openConnection();

                conn.setDoInput(true);

                conn.setDoOutput(true);

                conn.setUseCaches(false);

                conn.setRequestMethod("POST");

                conn.setRequestProperty("Connection", "Keep-Alive");

                conn.setRequestProperty("ENCTYPE", "multipart/form-data");

                conn.setRequestProperty("Content-Type", "multipart/form-data;boundary=" + boundary);

                conn.setRequestProperty("uploaded_file", fileName);

                // write data

                dos = new DataOutputStream(conn.getOutputStream());

                dos.writeBytes(twoHyphens + boundary + lineEnd);

                dos.writeBytes("Content-Disposition: form-data; name=\"uploaded_file\";filename=\"" + fileName + "\"" + lineEnd);

                dos.writeBytes(lineEnd);


                int bytesAvailable = mFileInputStream.available();

                int maxBufferSize = 1024 * 1024;

                int bufferSize = Math.min(bytesAvailable, maxBufferSize);


                byte[] buffer = new byte[bufferSize];

                int bytesRead = mFileInputStream.read(buffer, 0, bufferSize);


                // read image

                while (bytesRead > 0) {

                    dos.write(buffer, 0, bufferSize);

                    bytesAvailable = mFileInputStream.available();

                    bufferSize = Math.min(bytesAvailable, maxBufferSize);

                    bytesRead = mFileInputStream.read(buffer, 0, bufferSize);

                }


                dos.writeBytes(lineEnd);

                dos.writeBytes(twoHyphens + boundary + twoHyphens + lineEnd);

                mFileInputStream.close();

                dos.flush(); // finish upload...

                if (conn.getResponseCode() == 200) {

                    InputStreamReader tmp = new InputStreamReader(conn.getInputStream(), "UTF-8");

                    BufferedReader reader = new BufferedReader(tmp);

                    StringBuffer stringBuffer = new StringBuffer();

                    String line;

                    while ((line = reader.readLine()) != null) {

                        stringBuffer.append(line);

                    }

                }

                mFileInputStream.close();

                dos.close();

            }

        } catch (Exception e) {

            e.printStackTrace();

        }

    }


jsp 예제 소스입니다.

먼저 아래 라이브러리가 필요합니다.

WEB-INF/lib 아래에 넣어주시면 됩니다.

cos.jar

예제)

<%@page import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"%>

<%@page import="com.oreilly.servlet.MultipartRequest"%>

<%@ page pageEncoding="UTF-8"%>

<%

String dir = application.getRealPath("/프로젝트이름/실제 파일을 저장할 디렉토리");

 // 저는 "/altong/mon" 밑에 이미지를 저장했습니다.


int max = 10*1024*1024;

//최대크기, dir 디렉토리에 파일을 업로드하는 multipartRequest


MultipartRequest mr = new MultipartRequest(request, dir, max, "UTF-8");

String orgFileName = mr.getOriginalFileName("uploaded_file");

String saveFileName = mr.getFilesystemName("uploaded_file");


out.println(orgFileName+"이 저장되었습니다.");


%> 



이제 서버에 이미지를 저장했다면??

다시 가져올 수 도 있어야겠죠? 

먼저 안드로이드에서 라이브러러리 하나가 필요합니다.

뭐 다양한 라이브러리가 있지만 저는 Piccaso라는 오픈소스 라이브러리를 사용했어요~

build.gradle(Module:app) 안에

dependencies 안에


compile 'com.squareup.picasso:picasso:2.3.3'

을 넣어주시고 sync 해주시면 됩니다.

그리고 사용법은 아주 매우 간단합니다.

Picasso.with(getApplicationContext())

                            .load("이미지가 있는 URL/이미지이름.파일형식") 

                             ex)"http://123.123.123.123:8080/altong/mon/image.jpg" 

                            .placeholder(R.drawable.ic_account_circle_black_24dp)//이미지가 존재하지 않을                                                                                                      경우 대체 이미지

                            .resize(100, 100) // 이미지 크기를 재조정하고 싶을 경우

                            .into(이미지뷰);


간단하죠??

안드로이드 이미지 관련된 것들을 조금이라도 찾아보신 분들은

이번 포스팅을 어렵지 않게 이해하셨으리라 생각이 됩니다 ㅎㅎ

감사합니다.

반응형