반응형

 멀티파트는 JSP에서 request와 비슷한 개념입니다. 다만, Mutipart 객체는 이미지

전송에 특화된 것이 다른 점이죠. request 개념과 httppost 객체를 이해하시면 좀 더 도움이

될거에요. 모르시다면 한번 봐두 나중에 여러모로 도움이 되리라 생각합니다^^.




 멀티파트는 두 가지로 나누어서 설명을 할 건데요.

 

 이번 장에서는 안드로이드에서 서버로 이미지를 넘긴 뒤, 저장하기를 해보고,

 다음 장에서는 안드로이드가 서버에서 이미지를 받아오는 것을 보겠습니다.


 

 처음에 볼 것은 안드로이드 부분입니다.


1. 안드로이드

 안드로이드에서 보낼 때 사용하는 객체는 MultipartEntity라는 객체입니다. 이 객체는 파일 형식으로

데이터를 보내게 됩니다. 이 부분은 소스를 통해서 더 자세히 설명하도록 하겠습니다.


 우선은 MultipartEntity를 사용하기 위해선 몇 가지 라이브러리가 필요한데 그건 첨부파일로

다운받으시고, 받은 라이브러리 중 cos를 제외한 나머지 라이브러리들을 프로젝트 밑에 libs 폴더 

밑에 옮겨줍니다. 그럼 일단 준비는 다 끝났습니다.


 Multipart_Library.zip


				String sdcard = Environment.getExternalStorageDirectory().getPath();
							
				// 파일을 서버로 보내는 부분
				try {
					HttpClient client = new DefaultHttpClient();	
					String url = "http://175.210.155.212:8080/diary_server/getMultipart.jsp";
					HttpPost post = new HttpPost(url);
					
					// FileBody 객체를 이용해서 파일을 받아옴
					FileBody bin = new FileBody(glee);	
					File glee = new File(sdcard+"/glee.jpg");					

					MultipartEntity multipart = new MultipartEntity(
							HttpMultipartMode.BROWSER_COMPATIBLE);
					multipart.addPart("images", bin);

					post.setEntity(multipart); // Multipart를 post 형식에 담음
					client.execute(post);	// post 형식의 데이터를 서버로 전달




           



간략한 순서도를 그려보았습니다. HttpClient 인스턴스는 최종적으로 보낼 때

사용하게 되고, Post 방식으로 보내기 위해 HttpPost 인스턴스를 사용하고 멀티파트를

이 부분에 실어 보내게 됩니다. 그리고 멀티파트는 glee라는 파일을 FileBody라는

인스턴스에 담아서 보내게 되는 겁니다.


 즉, 예를 들자면 

 glee라는 사진을 FileBody라는 액자에 넣고, 

MultipartEntity라는포장지로 포장을 한 다음(addpart를 하고), 이름을 image라고 적어둡니다.

이렇게 포장된 사진을 다시 HttpPost라는 박스에 넣습니다(setEntity)


 그리고 박스에 주소를 씁니다(HttpClient에 url을 넣어 만듭니다). 

마지막으로 박스를 우체국에다 보내는 것(execute)까지 하고 나면

우리가 보내고자 하는 사진을 보내게 되는 겁니다. 


 그럼 이제 받는 쪽에서(서버에서)는 

박스를 받고

박스를 풀어야 겠죠? 


Tip) 여기선 하나만 보내기에 addpart를 하나만 했습니다만, 여러 사진을 같이 보내려고

     한다면 Intent를 사용하듯 여러 개의 사진을 addpart 해주면 되겠죠? 

      받는 쪽에선 여러 개를 받을 수 있는 방법을 고려하여 만드시면 됩니다. 







2. 서버

 이제 보내는이(안드로이드)가 아니라 받는이(서버)의 입장으로 가보겠습니다.

 우선 서버를 쓰려면 첨부파일 중 cos 라는 라이브러리가 필요한데요. 이 라이브러리를

WEB-INF 밑에 lib 폴더 안에 둡니다. lib폴더가 없다면 생성해서 넣으세요.


<%@ page language="java" contentType="text/html; charset=EUC-KR"
	pageEncoding="EUC-KR"%>
<%@ page
	import="com.oreilly.servlet.MultipartRequest"
	import="com.oreilly.servlet.multipart.DefaultFileRenamePolicy"
	import="java.util.*"
	import="java.io.*"%>

<%
	String savePath = "C:\\upload"; // 저장할 디렉토리 (절대경로)

	int sizeLimit = 5 * 1024 * 1024; // 5메가까지 제한 넘어서면 예외발생

	try {
		MultipartRequest multi = new MultipartRequest(request,
				savePath, sizeLimit, new DefaultFileRenamePolicy());
		/* Enumeration formNames = multi.getFileNames(); // 폼의 이름 반환
		String formName = (String) formNames.nextElement(); // 자료가 많을 경우엔 while 문을 사용
		String fileName = multi.getFilesystemName(formName); // 파일의 이름 얻기 */
		
		/* multi.getFile("images"); */ 
	} catch (Exception e) {
		out.print(e);
		out.print("예외 상황 발생..! ");
	}
%>


 MultipartEntity를 통해서 보낸 자료는 MultipartRequest를 통해서 받게 됩니다.

위에서 말한 예시를 좀 더 이어서 말하자면, 포장지를 뜯어서 저장해두기 위한 방법이

바로 MultipartRequest 인 겁니다. 

 저렇게만 해두면 사진이 저장됩니다(신기하지 않나요?!).


 그 밑에 주석들은 이 MultipartRequest를 좀 더 다양하게 활용하기 위한 방법들입니다.


 그건 이제 로직을 만들면서 활용하겠죠? ^^


 이제 서버에서도 무사히 받는 방법까지 알아봤으니 다음 편으로 넘어가서

받은 파일을 요청했을 때 그 파일을 보내주는 것을 알아보겠습니다.


PS - JSP 서버를 설정할 줄 모르시면 여기를 참고하세요!

PS2 - 궁금하시거나 좀 더 응용적인 활용을 알고 싶다면 댓글로 남겨주세요~

PS3 - 그외 제가 올린 자료 중 잘못 된 부분이 있어서 오류를 잡아주실 분들도 환영입니다!






반응형

WRITTEN BY
데르벨준

,