업로드 시 기본 설정
pom.xml
<!-- 파일업로드 시작 -->
<!-- common-fileupload 라이브러리는 tomcat7.0버전 이후로는
서블릿3.0이상에서 지원함
-->
<!-- https://mvnrepository.com/artifact/javax.servlet/javax.servlet-api -->
<dependency>
<groupId>javax.servlet</groupId>
<artifactId>javax.servlet-api</artifactId>
<version>3.1.0</version>
<scope>provided</scope>
</dependency>
<!-- https://mvnrepository.com/artifact/commons-fileupload/commons-fileupload -->
<dependency>
<groupId>commons-fileupload</groupId>
<artifactId>commons-fileupload</artifactId>
<version>1.4</version>
</dependency>
<!-- 파일을 처리하기 위한 의존 라이브러리 -->
<!-- https://mvnrepository.com/artifact/commons-io/commons-io -->
<dependency>
<groupId>commons-io</groupId>
<artifactId>commons-io</artifactId>
<version>2.11.0</version>
</dependency>
<!-- 썸네일 -->
<!-- https://mvnrepository.com/artifact/org.imgscalr/imgscalr-lib -->
<dependency>
<groupId>org.imgscalr</groupId>
<artifactId>imgscalr-lib</artifactId>
<version>4.2</version>
</dependency>
<!-- https://mvnrepository.com/artifact/net.coobird/thumbnailator -->
<dependency>
<groupId>net.coobird</groupId>
<artifactId>thumbnailator</artifactId>
<version>0.4.8</version>
</dependency>
<!-- 파일업로드 끝 -->
root-context.xml
<bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
<!-- 파일업로드 용량 (10MB)-->
<property name="maxUploadSize" value="10485760"/>
<property name="defaultEncoding" value="UTF-8" />
</bean>
<!-- 파일업로드 디렉토리 설정 -->
<bean id="uploadPath" class="java.lang.String">
<constructor-arg value="[프로젝트 내 폴더, 절대경로로 설정]"/>
</bean>
web.xml
<load-on-startup>1</load-on-startup>
<!-- web.xml의 설정은 WAS(Tomcat) 자체 설정일 뿐임. -->
<!-- multipart-config : 메모리사이즈, 업로드 파일 저장 위치, 최대 크기 설정 -->
<multipart-config>
<location>c:\\upload</location><!-- 업로드 되는 파일을 저장할 공간 -->
<max-file-size>20971520</max-file-size><!-- 업로드 파일의 최대 크기 1MB * 20 -->
<max-request-size>41943040</max-request-size><!-- 한 번에 올릴 수 있는 최대 크기 40MB -->
<file-size-threshold>20971520</file-size-threshold><!-- 메모리 사용 크기 20MB -->
</multipart-config>
<!-- multipart filter 추가하기 -->
<filter>
<display-name>springMultipartFilter</display-name>
<filter-name>springMultipartFilter</filter-name>
<filter-class>org.springframework.web.multipart.support.MultipartFilter</filter-class>
</filter>
<filter-mapping>
<filter-name>springMultipartFilter</filter-name>
<url-pattern>/*</url-pattern>
</filter-mapping>
servlet-context.xml
localhost/upload/파일을 주소창에 칠경우 해당 코드로 인해 뜨게된다
<resources mapping="/upload/**" location="file:\\\c:\\upload\\"></resources>
서버 설정 WAS(Tomcat) context.xml
config/context.xml의 <context>를 해당 것으로 변경한다
<Context allowCasualMultipartParsing="true" >
<!-- 케시문제 해결 -->
<Resources cachingAllowed="true" cacheMaxSize="100000"></Resources>
변경하지 않는다면 "Could not parse multipart servlet request" 에러가 발생
WAS에서 multipart를 찾지 못하게 된다
JSP
파일을 보낼 시에는
<form method="post" enctype="multipart/form-data">
<input type="file" />
</form>
해당 내용이 필수로 들어가야 한다.
register.jsp
<%@ page language="java" contentType="text/html; charset=UTF-8"%>
<%@ taglib uri="http://java.sun.com/jsp/jstl/core" prefix="c" %>
<script type="text/javascript" src="/resources/js/jquery.min.js"></script>
<h2>파일업로드</h2>
<form action="/item/registerPost" method="post" enctype="multipart/form-data">
<input type="file" name="uploadFile" />
<button type="submit">파일업로드</button>
</form>
JAVA
ItemController.java
package kr.or.ddit.dao;
import java.io.File;
import java.io.IOException;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestParam;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.multipart.MultipartFile;
import lombok.extern.slf4j.Slf4j;
@RequestMapping("/item")
@Slf4j
@Controller
public class ItemController {
//DI(의존성 주입), IoC(제어의 역전)
// root-context에 있는 value값 c:\\upload
@Autowired
String uploadPath;
// 파일 등록 폼
@GetMapping("/register")
public String register() {
return "item/register";
}
@ResponseBody
@PostMapping("/registerPost")
// public String registerPost(@RequestParam("uploadFile") MultipartFile uploadFile) {
// name 값이 그대로 와야함
public String registerPost(MultipartFile uploadFile) {
//MultipartFile : 스프링에서 제공해주는 타입
/*
--잘 씀
String getOriginalFileName() : 업로드 되는 파일의 이름(실제 파일명)
boolean isEmpty() : 파일이 없다면 true
long getSize() : 업로드되는 파일의 크기
transferTo(File file) : 파일을 저장
--잘 안씀..
String getName() : <input type="file" name="uploadFile" 에서 uploadFile을 가져옴
byte[] getBytes() : byte[]로 파일 데이터 반환
inputStream getInputStream() : 파일데이터와 연결된 InputStream을 반환
*/
log.info("filename : "+uploadFile.getOriginalFilename());
log.info("contentType : "+uploadFile.getContentType());
log.info("size : "+uploadFile.getSize());
// 계획 ( 경로와 파일이름 )
File uploadPath = new File(this.uploadPath, uploadFile.getOriginalFilename());
log.info("uploadPath : "+uploadPath);
// 파일 복사 실행
// 파일객체.transferTo(계획)
try {
uploadFile.transferTo(uploadPath);
} catch (IllegalStateException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return uploadFile.getOriginalFilename();
}
@PostMapping("/registerPost2")
public String registerPost2(@RequestParam("fileImage") MultipartFile fileImage, @RequestParam("name") String name) {
//MultipartFile : 스프링에서 제공해주는 타입
/*
--잘 씀
String getOriginalFileName() : 업로드 되는 파일의 이름(실제 파일명)
boolean isEmpty() : 파일이 없다면 true
long getSize() : 업로드되는 파일의 크기
transferTo(File file) : 파일을 저장
--잘 안씀..
String getName() : <input type="file" name="uploadFile" 에서 uploadFile을 가져옴
byte[] getBytes() : byte[]로 파일 데이터 반환
inputStream getInputStream() : 파일데이터와 연결된 InputStream을 반환
*/
log.info("filename : "+fileImage.getOriginalFilename());
log.info("contentType : "+fileImage.getContentType());
log.info("size : "+fileImage.getSize());
// 계획 ( 경로와 파일이름 )
File uploadPath = new File(this.uploadPath, fileImage.getOriginalFilename());
log.info("uploadPath : "+uploadPath);
// 파일 복사 실행
// 파일객체.transferTo(계획)
try {
fileImage.transferTo(uploadPath);
} catch (IllegalStateException | IOException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
return "redirect: http://localhost/upload/"+fileImage.getOriginalFilename();
}
}
'Spring' 카테고리의 다른 글
[Spring] mapper interface (0) | 2024.08.06 |
---|---|
[Spring] 스프링 form 태그, 이미지 저장(썸네일) (0) | 2024.08.05 |
[Spring] 다중 삽입하기 - 객체 (+ checkbox, select) (0) | 2024.08.02 |
[Spring] daum 우편번호 Api 사용하기 (0) | 2024.08.02 |
[Spring] 상품별 장바구니 목록 prod-cart-member (0) | 2024.07.31 |