Apache Commons IO 라이브러리🔎
- Apache 소프트웨어 재단에서 제공하는 오픈 소스 라이브러리로, Java 언어로 작성되어 있다.
- 입출력 작업을 보다 편리하게 수행할 수 있도록 다양한 유틸리티 메서드와 클래스를 제공한다.
- 주로 파일 및 스트림 처리와 관련된 작업을 단순화하고 개선하는 데 사용된다.
파일 구성🔎
패키지(경로) | 파일명 | |
com.test.file.controller | ||
FileController.java | ||
views | ||
add.jsp | ||
addok.jsp | ||
webapp/resources/files | ||
환경설정🔎
기본 설정
아래 글을 참조한다.
https://steady-record.tistory.com/entry/Spring-스프링-프로젝트-설정-일괄-적용
추가 설정
1. Commos Io 의존성 추가 - pom.xml
이전 사용했던 cos 라이브러리는 출시된지 오래되어 새로운 라이브러리로 사용한다.
<!-- commons io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
2. 버전 변경 - web.xml
StandardServletMultipartResolver 서블릿 3.0 이상의 버전에서 기본 제공하기 때문에 서블릿 버전을 변경한다.
web.xml 파일 상단 코드를 아래 코드로 대체한다.
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://xmlns.jcp.org/xml/ns/javaee"
xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee http://xmlns.jcp.org/xml/ns/javaee/web-app_3_1.xsd" id="WebApp_ID" version="3.1">
3. 파일 업로드 설정 - web.xml
<!-- 파일 업로드 설정 -->
<multipart-config>
<!-- 임시 폴더 지정 -->
<location>C:\\class\\code\\spring\\temp</location>
<!-- 파일 최대 크기 10MB -->
<max-file-size>10485760</max-file-size>
<!-- 한번에 업로드할 수 있는 파일들의 총 크기 합 : 50MB-->
<max-request-size>52428800</max-request-size>
<!-- 업로드에 사용할 메모리 용량 10MB -->
<file-size-threshold>10485760</file-size-threshold>
</multipart-config>
<servlet-mapping>
<servlet-name>appServlet</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
4. servlet-context.xml
Spring 웹 애플리케이션에서 파일 업로드를 활성화하기 위해 StandardServletMultipartResolver를 설정한다.
<!-- 파일 업로드 -->
<beans:bean id="multipartResolver" class="org.springframework.web.multipart.support.StandardServletMultipartResolver"></beans:bean>
구현 코드🔎
- 초기 세팅
FileController.java
package com.test.file.controller;
@Controller
public class FileController {
@Autowired
private FileDAO dao;
}
- 파일 등록하기
FileController.java
@GetMapping(value = "/add.do")
public String add(Model model) {
return "add";
}
@PostMapping(value = "/addok.do")
public String addok(Model model, String txt, MultipartFile attach, HttpServletRequest req) {
System.out.println(attach.getName()); //<input type="file" name="attach"
System.out.println(attach.getOriginalFilename()); //업로드 파일명
System.out.println(attach.getContentType()); //MIME : 첨부파일 종류 확인
System.out.println(attach.getSize()); //사이즈(Byte)
System.out.println(attach.isEmpty()); //존재 유무
try {
UUID uuid = UUID.randomUUID();
System.out.println(uuid);
String path = req.getRealPath("/resources/files");
System.out.println(path);
File file = new File(path + "\\" + uuid + "_" + attach.getOriginalFilename());
//임시 폴더에서 files 폴더로 이동
attach.transferTo(file);
model.addAttribute("txt", txt);
model.addAttribute("filename", uuid + "_" + attach.getOriginalFilename());
model.addAttribute("orgfilename", attach.getOriginalFilename());
} catch (Exception e) {
e.printStackTrace();
}
return "addok";
}
MultipartFile 첨부파일 처리해주는 객체로 getXXX() 메서드로 객체의 정보를 확인할 수 있다.
파일을 저장하는 할 때, 파일명 중복 방지를 위해 UUID를 사용한다.
UUID는 Universally Unique Id의 약자로 전세계 네트워크 상에서 고유성이 보장되는 ID를 만들기 위한 표준이다. 시간과 난수의 조합으로 이루어진다.
UUID를 이용하여 파일명을 바꾸고 attach.transferTo() 로 지정한 폴더 위치로 옮겨준다.
add.jsp
<%@ 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>
<html>
<head>
<meta charset="UTF-8">
<title>FileTest</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
</head>
<body>
<!-- add.jsp -->
<h1>파일 업로드</h1>
<form method="POST" action="/file/addok.do" enctype="multipart/form-data">
<table class="vertical">
<tr>
<th>텍스트</th>
<td><input type="text" name="txt" value="susukkang"></td>
</tr>
<tr>
<th>파일</th>
<td><input type="file" name="attach"></td>
</tr>
</table>
<div>
<button>보내기</button>
</div>
</form>
<script src="https://code.jquery.com/jquery-1.12.4.js" ></script>
</body>
</html>
addok.jsp
<%@ 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>
<html>
<head>
<meta charset="UTF-8">
<title>Insert title here</title>
<link rel="stylesheet" href="https://me2.do/5BvBFJ57">
</head>
<body>
<!-- addok.jsp -->
<h1>결과</h1>
<div class="message" title = "txt">${txt}</div>
<div class="message" title="file">
<a href="/file/resources/files/${filename}" download>${filename}</a>
</div>
<div class="message" title="file">
<a href="/file/download.do?filename=${filename}">${filename}</a>
</div>
<script src="https://code.jquery.com/jquery-1.12.4.js" ></script>
</body>
</html>
- 다운로드
FileController.java
@GetMapping(value = "/download.do", produces = MediaType.APPLICATION_OCTET_STREAM_VALUE)
@ResponseBody
public ResponseEntity<Resource> downloadFile(@RequestHeader("User-Agent") String userAgent, String filename, HttpServletRequest req) {
String path = req.getRealPath("/resources/files");
Resource resource = new FileSystemResource(path + "\\" + filename);
if (resource.exists() == false) {
return new ResponseEntity<>(HttpStatus.NOT_FOUND);
}
String resourceName = resource.getFilename();
// remove UUID
String resourceOriginalName = resourceName.substring(resourceName.indexOf("_") + 1);
HttpHeaders headers = new HttpHeaders();
try {
String downloadName = null;
if (userAgent.contains("Trident")) {
downloadName = URLEncoder.encode(resourceOriginalName, "UTF-8").replaceAll("\\+", " ");
} else if (userAgent.contains("Edge")) {
downloadName = URLEncoder.encode(resourceOriginalName, "UTF-8");
} else {
downloadName = new String(resourceOriginalName.getBytes("UTF-8"), "ISO-8859-1");
}
headers.add("Content-Disposition", "attachment; filename=" + downloadName);
} catch (UnsupportedEncodingException e) {
e.printStackTrace();
}
return new ResponseEntity<Resource>(resource, headers, HttpStatus.OK);
}
위 : download 옵션
아래 : download.do 메서드
'Spring' 카테고리의 다른 글
[Spring] Spring AOP : @Aspect 사용하기 (0) | 2023.11.29 |
---|---|
[Spring] Apache Commons IO 라이브러리(2) : 다중 file 입출력 (0) | 2023.11.29 |
[Spring] Tiles 프레임워크 : 레이아웃 프레임워크 (0) | 2023.11.29 |
[Spring] Spring MVC 프로젝트에 MyBatis 적용하기 : 코드 조각 관리 게시판 (0) | 2023.11.29 |
[Spring] MyBatis 쿼리문 작성하기 (0) | 2023.11.27 |