<form> 속성 : enctype="multipart/form-data"
multipart
기본 양식 content-type
application/x-www-form-urlencoded
<multipart-config>
<max-file-size>20971520</max-file-size> <!-- 한 파일당 최대 20mb-->
<max-request-size>41943040</max-request-size> <!-- 최대 업로드 파일 용량 -->
<max-file-size>20971520</max-file-size> <!-- 20MB 이하까지 메모리(lam)에 적재, 이상은 임시폴더에 파일저장하고 업로드 -->
</multipart-config>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<%@ page contentType="text/html; charset=UTF-8" %>
<%@ taglib prefix="c" uri="jakarta.tags.core" %>
<%@ taglib prefix="form" uri="http://www.springframework.org/tags/form" %>
<form:form method="post" autocomplete="off" enctype="multipart/form-data">
제목 : <input type="text" name="subject"><br>
파일 : <input type="file" name="file"><br>
<button type="submit">전송하기</button>
</form:form>


@RequestPart
동일 이름의 여러 파일을 전송하는 경우 : MultipartFile[]와 같은 배열로 주입
@Controller
@RequestMapping("/file")
public class FilController {
@GetMapping("/upload")
public String upload(){
return "file/upload";
}
@ResponseBody
@PostMapping("/upload")
public void uploadPs(@RequestPart("file") MultipartFile file){
String name = file.getOriginalFilename();
log.info(name);
}
}
@ResponseBody
@PostMapping("/upload")
public void uploadPs(@RequestPart("file") MultipartFile file){
String name = file.getOriginalFilename();
log.info(name);
File uploadPath = new File("/Users/oreo/Desktop/uploads/"+name);
try {
file.transferTo(uploadPath);
}catch(IOException e){
}
}
@Configuration
public class FileConfig implements WebMvcConfigurer {
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//파일 업로드 정적 경로 설정
registry.addResourceHandler("/uploads/**")
.addResourceLocations("file:/Users/oreo/Desktop/uploads/");
}
}
개발환경과 배포환경이 다르기 때문에, 설정을 달리해야한다.
프로필을 사용하여 환경마다 설정을 달리할 수 있도록 구현.
지정된 환경 변수 값 👉 @Profile에 설정시 @Bean을 프로필에 따라서 달리 생성하는 기능
매번 xml파일을 수정해야한다는 번거로움이 있어서 잘 사용하지않음.
<init-param>
<param-name>Spring.profiles.active</param-name>
<param-value>dev</param-value>
</init-param>
java -jar -Dspring.profiles.active=프로필이름

System.getEnv("환경 변수명")
DBconfig
@Configuration
@EnableTransactionManagement
@MapperScan("org.choongang")
@EnableJdbcRepositories("org.choongang")
public class DBConfig extends AbstractJdbcConfiguration {
@Bean(destroyMethod = "close")
public DataSource dataSource(){
DataSource ds = new DataSource();
// 연결 설정 S
ds.setDriverClassName("oracle.jdbc.driver.OracleDriver");
ds.setUrl("jdbc:oracle:thin:@localhost:1521:XE");
ds.setUsername(System.getenv("db.username")); //환경변수
ds.setPassword(System.getenv("db.password")); //환경변수
// 연결 설정 E
// 커넥션 풀 설정 S
ds.setInitialSize(2);
ds.setMaxActive(10);
ds.setTestWhileIdle(true);
ds.setMinEvictableIdleTimeMillis(1000 * 60);
ds.setTimeBetweenEvictionRunsMillis(1000 * 5);
// 커넥션 풀 설정 E
return ds;
}
...
}

@Configuration
@EnableWebMvc
@ComponentScan("org.choongang")
@Import({DBConfig.class, MessageConfig.class, InterceptorConfig.class, FileConfig.class})
@RequiredArgsConstructor
public class MvcConfig implements WebMvcConfigurer {
...
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
String fileName = "application";
String profile = System.getenv("spring.profiles.active");
fileName += StringUtils.hasText(profile) ? "-" + profile : "";
/**
* spring.profiles.active = dev
* -> application-dev
* Spring.profiles.active = prod
* -> application-prod
*/
PropertySourcesPlaceholderConfigurer conf = new PropertySourcesPlaceholderConfigurer();
conf.setLocations(new ClassPathResource(fileName));
return conf;
}
}
application-prod.properties
file.upload.path=/Users/oreo/uploads2/

MvcConfig
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigurer() {
PropertySourcesPlaceholderConfigurer conf = new PropertySourcesPlaceholderConfigurer();
conf.setLocations(new ClassPathResource("application.properties"));
return conf;
}
application.properties
file.upload.path=/Users/oreo/Desktop/uploads/
public static PropertySourcesPlaceholderConfigurer properties() {
PropertySourcesPlaceholderConfigurer configurer = new PropertySourcesPlaceholderConfigurer();
configurer.setLocations(
new ClassPathResource("db.properties"),
new ClassPathResource("info.properties"));
return configurer;
}
주입되는 값은 전부 문자열
FileConfig
@Configuration
public class FileConfig implements WebMvcConfigurer {
@Value("${file.upload.path}")
private String uploadPath;
@Override
public void addResourceHandlers(ResourceHandlerRegistry registry) {
//파일 업로드 정적 경로 설정
registry.addResourceHandler("/uploads/**")
.addResourceLocations("file:" + uploadPath);
}
}
FileController
@Slf4j
@Controller
@RequestMapping("/file")
public class FilController {
@Value("${file.upload.path")
private String uploadDir;
@GetMapping("/upload")
public String upload(){
return "file/upload";
}
@ResponseBody
@PostMapping("/upload")
public void uploadPs(@RequestPart("file") MultipartFile file){
String name = file.getOriginalFilename();
log.info(name);
File uploadPath = new File(uploadDir+name);
try {
file.transferTo(uploadPath);
}catch(IOException e){
}
}
}