본문 바로가기
공부기록

5월 23일 Spring - 파일 처리, 홈페이지 게시물 상세

by project100 2023. 5. 23.

파일 업로드 처리 시 유의 사항

1) form 태그에 enctype="multipart/form-data" 를 반드시 작성해야 한다.

2) 컨트롤러에서 파일을 받을 때 @RequestPart 어노테이션을 해당 파라미터 앞에 붙인다.

3) 파일을 받기 위한 매개변수는 List여야 한다. List<MultipartFile>

4) 매개변수 이름은 파일 태그에 name 속성 값과 같아야 한다. 또는 @RequestPart("name속성값")으로 작성한다.

5) 파일을 전송하거나 하지 않거나 List의 사이즈는 최소 1이다.

파일 목록의 사이즈가 1이고 첫번째 파일의 이름이 ""(공백)이면 파일을 전송한 것이 아니다.

 

다수의 파일 태그를 사용한 전송 시 컨트롤러에서 파일을 받을 때 개별적으로 처리할 수 있으며, 파일 목록 용 DTO를 작성하여 사용할 수 있다. 이때 @ModelAttribute 어노테이션을 사용한다.

 


한 폼에서 태그를 한개를 쓸 때, 여러 개를 쓸 때

하나를 받을 때와 여러 개를 받을 때

 

@PostMapping("fileProc1")
// 변수명과 이름 file name 일치 시키기
public String fileProc1(@RequestPart("file1") List<MultipartFile> file1, DataDto data){
log.info("fileProc1()");

return "result";
}
 
하나일 경우 @RequestPart("file1") 가로 생략 가능
@PostMapping("fileProc1")
// 변수명과 이름 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 객체로 넘어갈 때 형식 지정 가능

 

글 내용, 파일 목록, 댓글 목록