내 블로그 목록

2018년 8월 1일 수요일

[SpringFramework] java에서 txt파일 다운받기



[해야할 일]

0. 라이브러리 등록하기


  1. txt 파일을 만들어 WEB-INF 안에 넣어두기
  2. InternalResourceViewResolvew Bean 등록하기
  3. ViewResolver Bean 등록하기
  4. Controller 생성
  5. Customview 생성
  6. Customview Bean 등록

(0) 라이브러리 등록하기

1
2
3
4
5
6
<!-- https://mvnrepository.com/artifact/org.apache.poi/poi -->
        <dependency>
            <groupId>org.apache.poi</groupId>
            <artifactId>poi</artifactId>
            <version>3.9</version>
        </dependency>
cs

(1)txt 파일을 만들어 WEB-INF 안에 넣어두기



(2) InternalResourceViewResolvew Bean 등록하기
(3) ViewResolver Bean 등록하기


Servlet-context.xml에 등록해준다. 등록 시에는 충돌을 예방하기 위해 우선순위인 p:order을 지정해주는 것을 잊지말자.



1
2
3
4
5
6
7
8
9
<!-- Resolves views selected for rendering by @Controllers to .jsp resources in the /WEB-INF/views directory -->
   <beans:bean class="org.springframework.web.servlet.view.InternalResourceViewResolver" p:order="2">
       <beans:property name="prefix" value="/WEB-INF/views/" />
       <beans:property name="suffix" value=".jsp" />
   </beans:bean>
   
   <!-- CustomView: BeannameViewResolver는 파일을 등록해놓으면 id로 찾아간다는 것. -->
   <beans:bean id="viewResolver" class="org.springframework.web.servlet.view.BeanNameViewResolver"
   p:order="1" />


(4) Controller 생성 [DownloadController.java]


1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
package com.bitcampi.mvc0802;
import java.io.File;
import org.springframework.beans.BeansException;
import org.springframework.context.ApplicationContext;
import org.springframework.context.ApplicationContextAware;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.context.WebApplicationContext;
import org.springframework.web.servlet.ModelAndView;
@Controller
public class DownloadController implements ApplicationContextAware {
   private WebApplicationContext context;
   
   @RequestMapping("/file")
   public ModelAndView download() throws Exception {
       File downloadFile = getFile();
       return new ModelAndView("download", "downloadFile", getFile());
       //download이름의 뷰로 File(getFile())을 donwloadFile이름으로 전송한다.
       //download이름은 bean에 등록한다.
   }
   
   private File getFile() {
       String path = context.getServletContext().getRealPath("/WEB-INF/설명.txt");
       return new File(path);
   }
   @Override
   public void setApplicationContext(ApplicationContext applicationContext) throws BeansException {
       
       this.context = (WebApplicationContext) applicationContext;
   }
}


(5)Customview 생성 [DownloadView.java]


CustomeView를 java파일로 만들어야 한다.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
package com.bitcampi.mvc0802;
import java.io.File;
import java.io.FileInputStream;
import java.io.IOException;
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 {
   @Override
   protected void renderMergedOutputModel(Map<String, Object> model, HttpServletRequest request,
           HttpServletResponse response) throws Exception {
       File file = (File) model.get("downloadFile");
       response.setContentType("application/download; charset=utf-8");
       response.setContentLength((int) file.length()); // 파일의 길이 구하기
       /* 파일의 이름 구하기(utf-8) */
       // MSIE 여부 확인 후 파일이름(한글) 인코딩 처리
       //브라우저의 속성: User-Agent
       String userAgent = request.getHeader("User-Agent");
       String fileName = "";
       // 인터넷 익스플로어로 받을때 / 인터넷 익스프로러로 안받을 때
       // MSIE가 userAgent에서 0번째 이상부터 시작할 때,
       if (userAgent.indexOf("MSIE") > -1) {
           // 파일의 이름을 가지고 온다.
           fileName = URLEncoder.encode(file.getName(), "utf-8");
       } else {
           fileName = new String(file.getName().getBytes("utf-8"), "iso-8859-1");
       }
       /* 반환하는 파일의 이름 지정하기 */
       response.setHeader("Content-Disposition", "attachment; filename=\"" + fileName + "\";");
       // binary 코드로도 다운로드 될 수 있도록 설정.
       response.setHeader("Content-Transfer-Encoding", "binary");
       
       // response에서도 outputStream 객체 생성할 수 있도록 설정.
       OutputStream out = response.getOutputStream();
       FileInputStream fis = null;
       
       fis = new FileInputStream(file);
       FileCopyUtils.copy(fis, out);
       
       fis.close();
       out.flush();
       out.close();
   }
}

(6)Customview Bean 등록


Servlet-context.xml에 등록해준다. 다만, bean의 id는 Controller에서 return한 ModelAndView 객체의 첫번째 칸 이름과 같아야 한다.

1
2
<!-- txt 파일 넘기기 -->
   <beans:bean id="download" class="com.bitcampi.mvc0802.DownloadView"/>


결과)





댓글 없음:

댓글 쓰기