*인코딩
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를 통해 똑같은 아이디의 요청이 있는지 확인하고 처리할 빈을 선택해줍니다.
'Java > 스프링' 카테고리의 다른 글
SPRING AOP 관점지향프로그램밍 (0) | 2018.05.02 |
---|---|
spring 웹소켓으로 채팅창 만들기 (0) | 2018.04.24 |
mybatis 연결할 때 한번보기 위해 저장 (0) | 2018.04.13 |
Spring MyBatis 연동을 mapper 인터페이스 기반으로 변경 (0) | 2018.04.12 |
스프링 Mybatis를 XML DB 연결 (0) | 2018.04.12 |