*인코딩 

iso-8859-1(iso-lation-1) 기본 인코딩으로 많이 사용 , 한글지원이 안됨 

euc-kr(ms949, cp949) MS가 한글을 지원하기 위해 만든 인코딩 

utf-8 전 세계 모든 글자를 지원하기 위해 만든 인코딩 

최근에는 전부 utf-8로 인코딩합니다.









[ 1. home.jsp 파일에서 파일목록보기를 하면 c:\에 있는 파일들의 목록을 출력하기 ]



<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>홈</title>

</head>

<body>

  <a href="fileview.do"> 파일목록보기</a>

</body>

</html>


2. ViewService인터페이스를 implements한  ViewServiceImpl에서 파일이 존재하면 list에 저장하는 메소드를 구현 


package com.naseunghoo.service;


import java.io.File;

import java.util.ArrayList;

import java.util.List;


import org.springframework.stereotype.Service;




@Service

public class ViewServiceImpl implements ViewService {


//배열이나 List를 리턴하는 경우에 받는 쪽에서 거의 대부분 

//반복문을 시용하기 때문에 null을 리턴하면 안됩니다.

//객체 생성을 먼저해서 데이터가 없는 경웨 size 0가 

//되게 리턴해야 합니다.

@Override

public List<String> filelist() {

List<String> list = new ArrayList<String>();

//파일 목록을 조사할 디렉토리를 File객체로 생성 

File f= new File("c:\\");

//디렉토리 안의 모든 파일 및 디렉토리를 가져오기 

String [] ar = f.list();

//배열의 모든 데이터를 순회해서 .이 없는 것들만 list에 추가 

//위치를 찾아주는 메소드는 데이터가 없으면 음수를 리턴하거나 

//예외를 발생시킵니다. 

for(String imsi : ar) { 

if(imsi.indexOf(".")>=0) {

list.add(imsi);

}

}

return list;

}


}



3. 화면에 출력하기 

<%@ page language="java" contentType="text/html; charset=UTF-8"

    pageEncoding="UTF-8"%>

    <%@taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>

<!DOCTYPE html PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">

<html>

<head>

<meta http-equiv="Content-Type" content="text/html; charset=UTF-8">

<title>보여주기</title>

</head>

<body>

<table border="1">

<tr><th>파일명</tr>


<c:forEach var="item" items="${list}">

<tr>

<!-- 파라미터 이름  -->

<td><a href="download/${temp}">${temp}</a></td>

</tr>

</c:forEach>

</table>

</body>

</html>



**Web에서 파일 다운로드 

=> web서버에서 파일의 경로만 a href="파일경로"의 형식으로 링크를 걸면 파일을 다운로드 받을 수 있습니다. 

=> 직접 파일 경로를 설정한 경우에는 브라우저가 출력할 수 있는 파일의 경우 

=> 파일을 다운로드 하지 않고 실행을 시킵니다. 

텍스트 파일이나 이미지 파일의 경우는 화면에 출력됩니다.

=> 브라우저가 출력하지 않고 다운로드 하게 만들려면 파일경로에 Controller가 처리할 수 있는 링크를 만들어주고 Controller에서 다운로드하는 

뷰로 출력하도록 설정하면 됩니다 /.


1. fileview.jsp 파일의파일명을 출력하는 부분에 링크를 설정 

<!-- 파라미터 이름  -->

<td><a href="download?filename=${item}">${item}</a></td>


2. homeController에 위의 요청을 처리하는 메소드를 생성 

@RequestMapping(value="download/{}",method=RequestMethod.GET)

public String download(@PathVariable String filename, Model model){

File f= new File("c:\\ + filenaame");

//데이터 저장 

model.addAttribute("file", f);

//출력할 뷰 이름 리턴 

return "download";

}

3. file 이라는 이름으로 넘어온 파일 객체를 가지고 다운로드 화면을 만들어주는 뷰 클래스 생성 

= com.naseunghoo.view.view.DownloadView - AbstractView를 상속 

=> 화면을 직접 만들고자 할 때 AbstractView를 상속 받습니다.


package com.naseunghoo.view.view;


import java.io.File;

import java.io.FileInputStream;

import java.io.OutputStream;

import java.net.URLEncoder;

import java.util.Map;


import javax.servlet.http.HttpServletRequest;

import javax.servlet.http.HttpServletResponse;


import org.springframework.util.FileCopyUtils;

import org.springframework.web.servlet.view.AbstractView;


public class DownloadView extends AbstractView {


public DownloadView() {

super();

// 파일의 종류 설정 - 다운로드 받을 수 있도록 설정

setContentType("application/download; charset=utf-8");


}


userAgent 는 유저가 접속하는 브라우져를 알기 위해서 확인 

@Override

//

protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,

HttpServletResponse response) throws Exception {


// Controller에서 넘어온 데이터를 가져오기

// Map에서 데이터를 가져올 때는 반드시 원래의 자료형으로 형변환 해주어야합니다.

// model은 Map의 형태로 자료를 가지고 있고 값은 Object 이기 때문에

// 형변환 해주는 것입니다.

//get의 값은 controller에서 model로 보내는 addAttribute 키값을 적어주면 됩니다.  

File file = (File) model.get("file");

// 응답할 객체의 종류와 크기 설정

response.setContentLength((int) file.length());

response.setContentType(getContentType());


// 접속한 클라이언트의 운영체제 종류와 브라우저 종류를

// 알아 낼 수 있는 헤더 가져오기

String userAgent = request.getHeader("User-Agent");


// 접속한 브라우저가 IE 인지 확인

boolean ie = userAgent.indexOf("rv") > -1;

// 브라우저 별 파일 이름 설정

// 브라우저 별로 한글 인코딩은 다르게 설정됩니다.

// IE와 다른 브라우저로 구분

String filename = "";

if (ie) {

filename = URLEncoder.encode(file.getName(), "utf-8");

} else {

filename = new String(file.getName().getBytes("utf-8"), "iso-8859-1");

}


// 응답 객체에 파일 이름을 설정

response.setHeader("Content-Disposition", "attachment; fulename\"" + filename + "\";");


// 원본 파일의 내용을 읽어서 response를 통해서 전송

OutputStream out = response.getOutputStream();


try (FileInputStream fis = new FileInputStream(file)) {


FileCopyUtils.copy(fis, out);


} catch (Exception e) {

System.out.println("[다운로드] 예외 " + e.getMessage());

e.printStackTrace();

}

}


}



4. servlet-context.xml 파일에 가서 기존 ViewResolver의 우선 순위를 변경하고 beanNameViewResolver를 추가하고 download 뷰 요청이 왔을 때 출력할 뷰를 설정 


1) 출력할 뷰를 설정할 때 기존의 jsp가 아닌 직접 작성한 뷰로 출력할 수 있도록 해주는 

BeanNameViewResolver 클래스의 bean 을 생성 

beanNameViewResolver를 통해 똑같은 아이디의 요청이 있는지 확인하고 처리할 빈을 선택해줍니다.

<beans:bean class="org.springframework.web.servlet.view.BeanNameViewResolver">

<beans:property name="order" value="0"></beans:property>

</beans:bean>


2) 기존 VeiwResolver의 우선 순위를 변경 

<beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver">

에 아래 프로퍼티를 추가 

<beans:property name="order" value="1"></beans:property>



3) controller에서 download라는 뷰 이름을 넘겨줄 때 출력할 뷰를 직접 설정 

<beans:bean id="download" class="com.naseunghoo.view.view.DownloadView"></beans:bean>









[다른방법] 

1. 파라미터를 읽어서 수행해야할 경우 home.jsp  파일에  download 링크 파일을 수정  filename이라는 파라미터속성 추가 작성 


<td><a href="download?filename=${temp}">${temp}</a></td>



@RequestMapping(value="download",method=RequestMethod.GET)

public String download(@RequestParam("filename") String filename, Model model){

File f= new File("c:\\ + filename");

//데이터 저장 

model.addAttribute("file", f);

//출력할 뷰 이름 리턴 

return "download";

}

beanNameViewResolver를 통해 똑같은 아이디의 요청이 있는지 확인하고 처리할 빈을 선택해줍니다.

+ Recent posts