[학습을 위한 버전]
jdk : 11
이클립스
Spring : 5.1.2 RELEASE
apache-tomcat : 8.5 ↑
[학습을 위한 .xml 설정 (추후 사용할 것들 추가)]
0. 이클립스로 Maven Project 생성
- Tomcat path 설정 "/" 에서 실행되게 설정하기
1. pom.xml
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.mvc</groupId>
<artifactId>sts</artifactId>
<packaging>war</packaging>
<version>0.0.1-SNAPSHOT</version>
<name>sts Maven Webapp</name>
<url>http://maven.apache.org</url>
<properties>
<spring.version>5.1.3.RELEASE</spring.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-framework-bom</artifactId>
<version>${spring.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
</dependencies>
</dependencyManagement>
<dependencies>
<dependency>
<groupId>javax</groupId>
<artifactId>javaee-web-api</artifactId>
<version>7.0</version>
<scope>provided</scope>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>jstl</artifactId>
<version>1.2</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-webmvc</artifactId>
</dependency>
<!--
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-web</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.springframework.security</groupId>
<artifactId>spring-security-config</artifactId>
<version>5.1.2.RELEASE</version>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
<version>5.0.2.Final</version>
</dependency>
-->
<dependency>
<groupId>org.webjars</groupId>
<artifactId>bootstrap</artifactId>
<version>3.3.6</version>
</dependency>
<dependency>
<groupId>org.webjars</groupId>
<artifactId>jquery</artifactId>
<version>1.9.1</version>
</dependency>
<dependency>
<groupId>com.fasterxml.jackson.core</groupId>
<artifactId>jackson-databind</artifactId>
<version>2.9.0.pr3</version>
</dependency>
<dependency>
<groupId>log4j</groupId>
<artifactId>log4j</artifactId>
<version>1.2.17</version>
</dependency>
<!-- Unit Test Dependencies -->
<dependency>
<groupId>junit</groupId>
<artifactId>junit</artifactId>
<version>4.12</version>
</dependency>
<dependency>
<groupId>org.springframework</groupId>
<artifactId>spring-test</artifactId>
</dependency>
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
</dependency>
<dependency>
<groupId>org.mockito</groupId>
<artifactId>mockito-core</artifactId>
<version>1.9.0-rc1</version>
</dependency>
<!-- file upload example -LJB -->
<dependency>
<groupId>org.imgscalr</groupId>
<artifactId>imgscalr-lib</artifactId>
<version>4.2</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
<!-- 로그 찍기 위해 만듬 -->
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-api</artifactId>
<version>1.7.32</version> <!-- 원하는 버전을 여기에 지정하세요 -->
</dependency>
<dependency>
<groupId>org.slf4j</groupId>
<artifactId>slf4j-simple</artifactId>
<version>1.7.32</version>
</dependency>
</dependencies>
<build>
<pluginManagement>
<plugins>
<plugin>
<groupId>org.apache.maven.plugins</groupId>
<artifactId>maven-compiler-plugin</artifactId>
<version>3.2</version>
<configuration>
<verbose>true</verbose>
<source>1.8</source>
<target>1.8</target>
<showWarnings>true</showWarnings>
</configuration>
</plugin>
<plugin>
<groupId>org.apache.tomcat.maven</groupId>
<artifactId>tomcat7-maven-plugin</artifactId>
<version>2.2</version>
<configuration>
<path>/</path>
<contextReloadable>true</contextReloadable>
</configuration>
</plugin>
</plugins>
</pluginManagement>
</build>
<repositories>
<repository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</repository>
<repository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</repository>
</repositories>
<pluginRepositories>
<pluginRepository>
<id>spring-snapshots</id>
<name>Spring Snapshots</name>
<url>https://repo.spring.io/snapshot</url>
<snapshots>
<enabled>true</enabled>
</snapshots>
</pluginRepository>
<pluginRepository>
<id>spring-milestones</id>
<name>Spring Milestones</name>
<url>https://repo.spring.io/milestone</url>
<snapshots>
<enabled>false</enabled>
</snapshots>
</pluginRepository>
</pluginRepositories>
</project>
2. web.xml
<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns="http://java.sun.com/xml/ns/javaee" xsi:schemaLocation="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_3_0.xsd" version="3.0">
<display-name>UploadFileTest</display-name>
<servlet>
<servlet-name>dispatcher</servlet-name>
<servlet-class>
org.springframework.web.servlet.DispatcherServlet
</servlet-class>
<init-param>
<param-name>contextConfigLocation</param-name>
<param-value>/WEB-INF/context.xml</param-value>
</init-param>
<load-on-startup>1</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>dispatcher</servlet-name>
<url-pattern>/</url-pattern>
</servlet-mapping>
<!--
<filter>
<filter-name>springSecurityFilterChain</filter-name>
<filter-class>org.springframework.web.filter.DelegatingFilterProxy</filter-class>
</filter>
<filter-mapping>
<filter-name>springSecurityFilterChain</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
<error-page>
<location>/WEB-INF/views/common/error.jsp</location>
</error-page>
-->
</web-app>
<!-- file upload example -LJB -->
<dependency>
<groupId>org.imgscalr</groupId>
<artifactId>imgscalr-lib</artifactId>
<version>4.2</version>
</dependency>
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.3.2</version>
</dependency>
설명 | imgScalr - 이미지 축소 라이브러리,
3. context.xml (/WEB-INF/webapp/)
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
xmlns:context="http://www.springframework.org/schema/context"
xmlns:mvc="http://www.springframework.org/schema/mvc" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-4.0.xsd
http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-4.0.xsd
http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-4.0.xsd">
<context:component-scan base-package="com.sts" />
<bean
class="org.springframework.web.servlet.view.InternalResourceViewResolver">
<property name="prefix">
<value>/WEB-INF/views/</value>
</property>
<property name="suffix">
<value>.jsp</value>
</property>
</bean>
<!-- fileupload Test - LJB -->
<bean
id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<property name="maxUploadSize" value="10485760"></property>
</bean>
<mvc:resources mapping="/webjars/**" location="/webjars/" />
<!--
<bean id="messageSource"
class="org.springframework.context.support.ReloadableResourceBundleMessageSource">
<property name="basename" value="classpath:messages" />
<property name="defaultEncoding" value="UTF-8" />
</bean>
<bean id="localeResolver"
class="org.springframework.web.servlet.i18n.SessionLocaleResolver">
<property name="defaultLocale" value="en" />
</bean>
<mvc:interceptors>
<bean id="localeChangeInterceptor"
class="org.springframework.web.servlet.i18n.LocaleChangeInterceptor">
<property name="paramName" value="language" />
</bean>
<bean
class="com.mastering.spring.springmvc.controller.interceptor.HandlerTimeLoggingInterceptor" />
</mvc:interceptors>
-->
<mvc:annotation-driven />
</beans>
<!-- fileupload Test - LJB -->
<bean
id="multipartResolver" class="org.springframework.web.multipart.commons
.CommonsMultipartResolver">
<property name="masUploadSize" value="10485760"></property>
</bean>
설명 | 업로드 파일 최대 사이즈 지정 약 10MB
[1 일반적인 파일 업로드 GET]
- UploadController.java
package com.sts.controller;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
@Controller
public class UploadController {
private static final Logger logger =
LoggerFactory.getLogger(UploadController.class);
@RequestMapping(value="/uploadForm", method = RequestMethod.GET)
public void uploadForm() {
}
}
- uploadForm.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"">
<title>uploadForm.jsp</title>
</head>
<body>
<!-- 일반적인 form 방식과 달리 multipart 방식으로 데이터가 전달된다 -->
<form id="form1" action="uploadForm" method="post" enctype="multipart/form-data">
<input type="file" name="file"/><input type="submit" />
</form>
</body>
</html>
- 실행 화면
[ POST 방식 파일 업로드 처리]
- UploadController에 추가할 메소드
@RequestMapping(value="/uploadForm", method = RequestMethod.POST)
public void uploadForm(MultipartFile file, Model model) throws Exception{
logger.info("originalName:" + file.getOriginalFilename());
logger.info("size: " + file.getSize());
logger.info("contentType: " + file.getContentType());
}
설명|
MultipartFile : POST 방식으로 들어온 파일 데이터 의미
위 객체를 이용하면 getOriginalFilename() 또는 getSize()로 파일의 MIME 타입과 같은 정보 추출 가능
- web.xml 에 한글 필터 적용
<!-- 한글 필터 때문에 추가한 부분 -->
<filter>
<filter-name>encoding</filter-name>
<filter-class>org.springframework.web.filter.CharacterEncodingFilter</filter-class>
<init-param>
<param-name>encoding</param-name>
<param-value>UTF-8</param-value>
</init-param>
</filter>
<filter-mapping>
<filter-name>encoding</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
- uploadForm.jsp (그대로)
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"">
<title>uploadForm.jsp</title>
</head>
<body>
<!-- 일반적인 form 방식과 달리 multipart 방식으로 데이터가 전달된다 -->
<form id="form1" action="uploadForm" method="post" enctype="multipart/form-data">
<input type="file" name="file"/><input type="submit" />
</form>
</body>
</html>
- 실행 화면 (콘솔)
[ 업로드 파일 저장 ] (업로드 + 다운로드)
설정된 경로를 이용하고 파일을 저장하는 코드는 UploadController를 수정해서 처리
- 수정 후 UploadController.java 전체 코드
package com.sts.controller;
import java.io.File;
import java.util.UUID;
import javax.annotation.Resource;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.stereotype.Controller;
import org.springframework.ui.Model;
import org.springframework.util.FileCopyUtils;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.multipart.MultipartFile;
@Controller
public class UploadController {
// 파일 업로드 GET 방식으로 넘겨받을 때
private static final Logger logger =
LoggerFactory.getLogger(UploadController.class);
@RequestMapping(value="/uploadForm", method = RequestMethod.GET)
public void uploadForm() {
}
// 파일 저장하는 코드
@Resource(name="uploadPath")
private String uploadPath;
// 파일 업로드 POST 방식으로 넘겨받을 때
@RequestMapping(value="/uploadForm", method = RequestMethod.POST)
public String uploadForm(MultipartFile file, Model model) throws Exception{
logger.info("originalName:" + file.getOriginalFilename());
logger.info("size: " + file.getSize());
logger.info("contentType: " + file.getContentType());
// 파일 저장을 위해 추가한 코드
String savedName = uploadFile(file.getOriginalFilename(), file.getBytes());
model.addAttribute("savedName", savedName);
// 업로드 결과 출력 페이지
return "uploadResult";
}
private String uploadFile(String originalName, byte[] fileData) throws Exception{
// UUID는 중복되지 않는 고유 키 값 설정 시 사용되는 util
UUID uid = UUID.randomUUID();
// 임의의 고유키값_파일이름 형태로 만듦
String savedName = uid.toString() + "-" + originalName;
File target = new File(uploadPath,savedName);
// 따라서 여기는 .copy(fileData, new File(uploadPath, savedName))
// 파일 , 업로드 경로, 파일명+크기 정보가 담기게 됨
FileCopyUtils.copy(fileData, target);
return savedName;
}
}
- 파일 저장될 경로를 context.xml에 추가해주어야 한다 추가할 코드
<!-- 파일 업로드 하면 저장될 경로 지정 bean 에다가 -->
<bean
id="uploadPath" class="java.lang.String">
<!-- 경로는 미리 생서해두어야 한다. -->
<constructor-arg value="C://zzz//upload"></constructor-arg>
</bean>
- uploadResult.jsp
결과 출력 페이지 : UploadForm.jsp 안의 <iframe> 내에서 동작하기 위해 작성됨
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<%@page session="false" %>
<%@ taglib prefix="c" uri="http://java.sun.com/jsp/jstl/core" %>
<script>
/*결과 출력 페이지 : UploadForm.jsp 안의 <iframe> 내에서 동작하기 위해 작성됨 */
var result = "${savedName}";
// 자신이 속한 화면의 parent 의 addFilePath() 함수 호출
parent.addFilePath(result);
</script>
- 결과 페이지를 iframe으로 가지고 오기위한 수정 후의 uploadForm.jsp 전체 코드
<%@ page language="java" contentType="text/html; charset=UTF-8"
pageEncoding="UTF-8"%>
<!DOCTYPE html>
<html>
<head>
<meta charset="UTF-8"">
<title>uploadForm.jsp</title>
<style>
iframe{
/* 0px로 지정해서 실제로는 보이지 않겠지만 이를 통해 ajax 와 유사하게
파일이 업로드 된 것을 확인할 수 있 음 */
width: 0px;
height: 0px;
border: 0px;
}
</style>
</head>
<body>
<!-- 일반적인 form 방식과 달리 multipart 방식으로 데이터가 전달된다 -->
<form id="form1" action="uploadForm" method="post"
enctype="multipart/form-data" target="zeroFrame">
<input type="file" name="file"/><input type="submit" />
</form>
<!-- 위 fram 태크에서 target으로 지정한 name이 와야 iframe으로 지정해서 불러올 수 있음 -->
<iframe name="zeroFrame"></iframe>
<script>
function addFilePath(msg){
alert(msg);
document.getElementById("form1").reset();
}
</script>
</body>
</html>
- 실행 결과
'spring framework' 카테고리의 다른 글
@2 spring framework 핵심 - ApplicationContext (0) | 2023.11.03 |
---|---|
@1 spring framework 핵심 - IOC & bean (0) | 2023.11.03 |
스프링 프레임워크 #7 - 부트 스트랩 - 메이븐 설정, 단위테스트, 통합테스트 (0) | 2023.09.21 |
스프링 프레임워크 #6 - 모델, 세션, 예외처리 (0) | 2023.09.18 |
스프링 프레임워크 #5 Spring MVC 핵심 개념 (RequestMapping, 뷰 리졸버, 핸들러, 인터셉터) (0) | 2023.09.17 |