안녕하세요 알통몬입니다. 공감 및 댓글은 포스팅 하는데 아주아주 큰 힘이 됩니다!! 포스팅 내용이 찾아주신 분들께 도움이 되길 바라며 더 깔끔하고 좋은 포스팅을 만들어 나가겠습니다^^
|
오랜만에 안드로이드 포스팅을 하는데요.
안드로이드에서 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 아래에 넣어주시면 됩니다.
예제)
<%@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(이미지뷰); |
간단하죠??
안드로이드 이미지 관련된 것들을 조금이라도 찾아보신 분들은
이번 포스팅을 어렵지 않게 이해하셨으리라 생각이 됩니다 ㅎㅎ
감사합니다.
'안드로이드' 카테고리의 다른 글
안드로이드 android 주소를 경위도 좌표로 변환해주는 메소드!! (0) | 2017.04.17 |
---|---|
안드로이드 dialog 에서 activity로 또는 dialogFragment에서 fragment로 데이터 전달 (4) | 2017.04.13 |
안드로이드 Fragment에서 Dialog 띄우기 ==> DialogFragment (2) | 2017.03.25 |
안드로이드 TabLayout + ViewPager 탭 레이아웃 + 뷰페이저 만들기 (0) | 2017.03.25 |
안드로이드 커스텀 다이얼로그 custom dialog 만들기 (0) | 2017.03.25 |