자바(Java)/JAVA 2EE

클라이언트가 파일을 다운로드 받을 수 있게 처리하는 방법

본클라쓰 2010. 1. 16. 11:37

클라이언트가 파일을 다운로드 받을 수 있게 처리하는 방법


 일반적으로 웹 브라우저는 문서의 타입을 해석해 브라우저에서 표현할 수 있다면 직접 브라우저에서 출력합니다. 따라서 HTML 문서에 링크를 걸어 다운로드가 가능한 파일은 zip 파일 같은 바이너리 파일입니다. 하지만 텍스트 파일과 이미지 파일은 브라우저에서 직접 출력합니다. 따라서 웹 브라우저가 출력할 수 있는 파일을 다운로드 받을 수 있도록 처리하기 위해서는 문서 타입을 변경하고 스트림을 통해 데이터를 전송해야 합니다.  

 

 아래와 같이 바이너리 파일은 직접 링크를 걸어 다운로드가 가능합니다. ( zip 파일, 실행파일 등 )

<a href="file/test.zip" target="top"> 테스트 zip 파일 다운로드 </a>

 

 하지만 텍스트 파일이나 이미지 파일을 다운로드 할 수 있도록 하려면 문서 타입을 변경하여 스트림으로 보내는 페이지를 작성하여 해당 파일을 다운로드 페이지에서 다운받도록 변경해야 합니다. 아래와 같이 다운로드 페이지를 작성해야 합니다.

<a href="download/download.jsp?fileName="test.txt" target="top"> 테스트 txt 파일 </a>

 

 

 

 

 

다운로드 페이지 작성 방법

 

 다운로드 페이지의 문서의 MIME 타입을 application/octer-stream 으로 변경합니다. application/octer-stream 타입은 문서의 종류를 바이너리 형태임을 나타내며 웹 브라우저는 해당 문서를 스트림을 통해 다운로드 받을 수 있게 변경합니다. MIME 타입 지정은 문서의 최상단에 위치해야 합니다.

response.setContentType("applicatin/octer-stream");

 

 스트림을 통한 전송

String fileName = request.getParameter("fileName");

// 웹 서블릿에 파일이 저장되는 디렉토리를 가져옴 

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 클래스를 스트림에 연결하려 파일을 전송합니다.