티스토리 뷰

반응형

목차

1. 파일 전송 방식 : io로 처리

2. file upload API : 라이브러리로 처리 

3. 자료실의 파일 저장 및 다운로드 구현 : 앞서 만들었던 게시판의 연장선


파일 전송을 위한 FORM 설정

* 파일 자체의 전송 개념이 아니다.

* 이 파일을 읽고, 상대방이 쓰는 개념이기 때문에, 파일 안의 내용이 전송된다는 것이다.

* POST 방식에서 enctype을 multipart/form-data로 설정 : type 속성이 file인 <input> 태그를 통해 파일 선택

 

▲ [예제1]

파일을 업로드 하기 위해 <form> 태그의 enctype 속성의 값을 multipart/form-data로 설정

파일을 선택하기 위해 type이 file인 <input>태그를 두 개 설정했음

<%@ page contentType="text/html; charset=UTF-8"%>
<html>
<head><title>multipart 폼</title></head>
<body>

<form action="multipart_data.jsp" method="post" enctype="multipart/form-data">
text1 : <input type="text" name="text1" /><br/>
file1 : <input type="file" name="file1" /><br/>
file2 : <input type="file" name="file2" /><br/>
<input type="submit" value="전송" />

</form>
</body>
</html>

파일 선택 폼은 웹 브라우저에 따라 다름

이클립스 내에서 실행한 화면

 

크롬에서 실행한 화면


multipart/form-data로 전송된 데이터 형식

▲ [예제2]

실행 화면에서 [전송] 버튼을 클릭하면 multipart/form-data 인코딩을 이용해 텍스트 데이터와 파일 데이터를 [예제2]로 전송

전송 받은 데이터를 그대로 응답 데이터로 출력하여 실제로 어떤 데이터가 전송되는지 확인할 수 있게 만든 예제

<%@ page contentType="text/plain; charset=UTF-8"%>
<%@ page import = "java.io.InputStream" %>
<%@ page import = "java.io.IOException" %>
<%@ page trimDirectiveWhitespaces = "true" %>

<%
	InputStream is = null;

	out.print("[");
	out.print(request.getContentType());
	out.print("]");
	
	try{
		is = request.getInputStream();
		int data = -1;
		
		while((data = is.read()) != -1){
			out.print((char)data);
		}
	} finally{
		if(is != null) try{is.close();} catch(IOException ex){}
	}
%>

* trimDirectiveWhitespaces : 공백 없앰

* getContentType : 어떤 타입을 요청했는지 출력

결과화면


FileUpload API

프로젝트 > src > WEB-INF > lib에 복붙하기 :

commons-fileupload-1.2.1.jar
0.06MB
commons-io-1.3.2.jar
0.08MB


업로드 한 파일 처리 방법

▲ FileItem.write(File file) 메서드를 사용하는 방법

▲ FileItem.getInputStream() 메서드로 구한 입력 스트림으로부터 바이트 데이터를 읽어와서 FileOutputStream을 사용해서 파일에 출력하는 방법

FileItem.get() 메서드로 구한 바이트 배열을 FileOutputStream을 사용해서 파일에 출력하는 방법


<자료실>업로드 한 파일 저장 방식

1) DB의 BLOB에 저장 : 잘 안넣음

2) 파일 시스템에 저장 : 원하는 디렉토리에 업로드 폴더를 만들어 놓고 그 안에서 쓰는 방법이 대부분

- 저장할 때 사용하는 파일의 이름은 현재 시간 등의 값을 이용해서 생성
게시글 번호와 첨부된 순서 번호를 함께 사용하기도 함
- 실제 파일 이름은 DB에 저장

<자료실>다운로드의 구현

▲ 다운로드 구현 시 고려 사항

- 응답 컨텐츠 타입 : application/octet-stream

- 헤더 : Content-Disposition 파일명 지정 : 파일명 설정 시, ISO-8859-1로 인코딩 변환해서 설정

▲ 실제 파일 전송

- response.getOutputStream()으로 구한 OutputStream에 파일 데이터 출력하기 

반응형
댓글