클라이언트가 파일을 다운로드 받을 수 있게 처리하는 방법
일반적으로 웹 브라우저는 문서의 타입을 해석해 브라우저에서 표현할 수 있다면 직접 브라우저에서 출력합니다. 따라서 HTML 문서에 링크를 걸어 다운로드가 가능한 파일은 zip 파일 같은 바이너리 파일입니다. 하지만 텍스트 파일과 이미지 파일은 브라우저에서 직접 출력합니다. 따라서 웹 브라우저가 출력할 수 있는 파일을 다운로드 받을 수 있도록 처리하기 위해서는 문서 타입을 변경하고 스트림을 통해 데이터를 전송해야 합니다.
아래와 같이 바이너리 파일은 직접 링크를 걸어 다운로드가 가능합니다. ( zip 파일, 실행파일 등 )
하지만 텍스트 파일이나 이미지 파일을 다운로드 할 수 있도록 하려면 문서 타입을 변경하여 스트림으로 보내는 페이지를 작성하여 해당 파일을 다운로드 페이지에서 다운받도록 변경해야 합니다. 아래와 같이 다운로드 페이지를 작성해야 합니다.
다운로드 페이지 작성 방법
다운로드 페이지의 문서의 MIME 타입을 application/octer-stream 으로 변경합니다. application/octer-stream 타입은 문서의 종류를 바이너리 형태임을 나타내며 웹 브라우저는 해당 문서를 스트림을 통해 다운로드 받을 수 있게 변경합니다. MIME 타입 지정은 문서의 최상단에 위치해야 합니다.
스트림을 통한 전송
// 웹 서블릿에 파일이 저장되는 디렉토리를 가져옴
ServletContext context = getServletContext();
String path = context.getRealPath("/files");
// 헤더에 attachment 속성을 사용하면 브라우저는 무조건 다운로드 창을 띄우고 파일명을 보여줌
response.setHeader("Content-Disposition", "attachment;filename="+fileName+";");
// 파일객체를 생성
File file = new File( path + "/" + fileName );
int fileSize = (int)file.length();
byte[] buffer = new byte[ fileSize ];
if ( file.isFile() ) {
BufferedInputStream is =
new BufferedInputStream( new FileInputStream( file ) );
BufferedOutputStream os =
new BufferedOutputStream( response.getOutputStream() );
try {
int read = 0;
while ( ( read = file.read(buffer)) != 1 ) { os.write(buffer, 0, read); }
} catch(Exception e) {
e.printStackTrace();
} finally {
if ( os != null ) try { os.close(); } catch(Exception e) {}
if ( is != null ) try { is.close(); } catch(Exception e) {}
}
}
response.setContentType("application/octer-stream"); 메소드를 사용하여 mime 타입을 application/octer-stream로 설정한 이유는 페이지의 타입을 Byte 타입으로 하여 다운로드 페이지임을 나타내기 위함입니다. 또한, response.setHeader("Content-Disposition", "attachment;filename="+filename+";"); 페이지 헤더 속성 중 Content-Disposition에 attachment 속성으로 변경하여 파일 다운로드 창을 띄우고 파일명을 보여줍니다. 그 후에 File 클래스를 스트림에 연결하려 파일을 전송합니다.
'자바(Java) > JAVA 2EE' 카테고리의 다른 글
commons-fileupload 패키지를 사용한 파일 업로드 처리 방법 (0) | 2010.01.16 |
---|---|
MultipartRequest 클래스를 사용한 파일 업로드 (0) | 2010.01.16 |
페이지 소스보기에서 공백(JSP가 사용된 부분) 제거하기 (0) | 2010.01.15 |
캐시(cache) 사용금지를 위한 응답 헤더 설정 (0) | 2010.01.11 |
날짜와 시간 처리 방법 (0) | 2010.01.04 |