파일 업로드 처리 시 유의 사항
1) form 태그에 enctype="multipart/form-data" 를 반드시 작성해야 한다.
2) 컨트롤러에서 파일을 받을 때 @RequestPart 어노테이션을 해당 파라미터 앞에 붙인다.
3) 파일을 받기 위한 매개변수는 List여야 한다. List<MultipartFile>
4) 매개변수 이름은 파일 태그에 name 속성 값과 같아야 한다. 또는 @RequestPart("name속성값")으로 작성한다.
5) 파일을 전송하거나 하지 않거나 List의 사이즈는 최소 1이다.
파일 목록의 사이즈가 1이고 첫번째 파일의 이름이 ""(공백)이면 파일을 전송한 것이 아니다.
다수의 파일 태그를 사용한 전송 시 컨트롤러에서 파일을 받을 때 개별적으로 처리할 수 있으며, 파일 목록 용 DTO를 작성하여 사용할 수 있다. 이때 @ModelAttribute 어노테이션을 사용한다.
한 폼에서 태그를 한개를 쓸 때, 여러 개를 쓸 때
하나를 받을 때와 여러 개를 받을 때
// 변수명과 이름 file의 name 일치 시키기
public String fileProc1(@RequestPart("file1") List<MultipartFile> file1, DataDto data){
log.info("fileProc1()");
return "result";
}
// 변수명과 이름 file의 name 일치 시키기
public String fileProc1(@RequestPart List<MultipartFile> file1, DataDto data){
log.info("fileProc1()");
return "result";
}
fileProc1
fileProc2
package com.raspberry.fileuploadprj.controller;
import com.raspberry.fileuploadprj.dto.DataDto;
import lombok.extern.slf4j.Slf4j;
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.RequestPart;
import org.springframework.web.multipart.MultipartFile;
import javax.swing.plaf.PanelUI;
import java.util.List;
@Controller
@Slf4j
public class HomeController {
// @Autowired
@GetMapping("/")
public String home(){
log.info("home()");
return "index";
}
@PostMapping("fileProc1")
// 변수명과 이름 file의 name 일치 시키기
public String fileProc1(@RequestPart List<MultipartFile> file1, DataDto data){
log.info("fileProc1()");
return "result";
}
@PostMapping("fileProc2")
public String fileProc2(@RequestPart List<MultipartFile> file2, DataDto data){
log.info("fileProc2()");
return "result";
}
@PostMapping("fileProc3")
public String filrProc3(@RequestPart List<MultipartFile> file3,
@RequestPart List<MultipartFile> file4,
@RequestPart List<MultipartFile> file5,
DataDto data){
log.info("fileProc3()");
return "result";
}
}
쓰레드(thread) : 작업 단위로 명령어 묶음(single / Multi)
프로그램 : 저장
프로세스 : 실행, 하나의 이상의 쓰레드로 구성
context - 과정, 정보를 가지고 있는 쓰레드를 관리
파일의 경로, 폴더의 경로 등을 모아서 관리
package com.raspberry.fileuploadprj.service;
import jakarta.servlet.http.HttpSession;
import lombok.extern.slf4j.Slf4j;
import org.springframework.stereotype.Service;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.List;
@Service
@Slf4j
public class HomeService {
public String fileUpload1(List<MultipartFile> file, HttpSession session) throws IOException {
log.info("fileUpload1()");
// 파일 저장 위치 지정. session으로 처리, 루트 경로
String realPath = session.getServletContext().getRealPath("/");
log.info(realPath);
// 파일 업로드용 폴더 생성
realPath += "upload/";
File folder = new File(realPath);
// if(folder.isDirectory() == false)
if(!folder.isDirectory()){
folder.mkdir(); // 폴더 생성 메소드
}
// 하나일 때나 여러 개일 때나 같음
// 파일 목록에서 파일을 가져와서 개별적으로 처리
for(MultipartFile mf : file){
// 파일명 가져오기
String fname = mf.getOriginalFilename();
if(fname.equals("")){
// 업로드 안 한 상태
return "result"; // 파일 처리 중지!
}
// 파일 이름 변경(덮어쓰기 방지)
// currentTimeMillis() 시간을 밀리세컨드 값으로 구해주는 함수
// fname.substring(fname.lastIndexOf(".") 확장자 붙여주기
// 예 very.jpg => 7845612542.jpg
String sname = System.currentTimeMillis() + fname.substring(fname.lastIndexOf("."));
File ufile = new File(realPath + sname);
// 파일 저장, 예외처리 해주어야 함
mf.transferTo(ufile);
}// for end
return "result";
}
}
.
1. bfiledto
2. boardService - fileUpload() 메소드
3. boardDao - boardDao.xml
4. boardSevice
게시물 상세보기
1. boardContents.jsp
2. boardController
3. boardSevice
jsonformat - 라이브러리, json 객체로 넘어갈 때 형식 지정 가능
글 내용, 파일 목록, 댓글 목록
'공부기록' 카테고리의 다른 글
5월 24일 Spring - 홈페이지 삭제 처리 (0) | 2023.05.24 |
---|---|
5월 24일 Spring - 게시판 다운로드, 댓글 처리 (0) | 2023.05.24 |
5월 22일 Spring - 홈페이지 게시글 (0) | 2023.05.22 |
5월 19일 Spring - 홈페이지 게시글 목록 처리 (0) | 2023.05.19 |
5월 18일 Spring - 홈페이지 로그인 DB 연동 (0) | 2023.05.18 |