loading

새소식

Framework/Springboot

[Springboot] 스프링부트 파일 업로드 및 파일 다운로드

  • -
728x90
반응형

[7주차] 2023.10.06 (금)

🔷 File Upload 🔷

1. 사용 전 application.properties 세팅

# 파일 업로드 #
spring.servlet.multipart.max-file-size=2097152
spring.servlet.multipart.max-request-size=2097152

 

2. 하나의 파일 업로드 사용법

(1) MultipartHttpServletRequest 이용 (제일 유연함)

// UploadController.java // 

@Controller
public class UploadController {
    @GetMapping("/upload1")
    public String upload1() {
        return "upload1";
    }

    @PostMapping("/upload1")
    @ResponseBody
    public String upload1Post(MultipartHttpServletRequest mRequest) {
        MultipartFile mFile = mRequest.getFile("file");
        String fileName = mFile.getOriginalFilename();
        long size = mFile.getSize();

        File folder = new File("C:/Users/user/Desktop/Module1_Web/Springboot/basic/files");
        folder.mkdirs();
        File file = new File("C:/Users/user/Desktop/Module1_Web/Springboot/basic/files/" + fileName);
        try {
            mFile.transferTo(file);
        } catch (IllegalStateException e) {
            e.printStackTrace();
        } catch (IOException e) {
            e.printStackTrace();
        }
        return fileName + size;
    }
}
// upload1.html //

<form method="post" enctype="multipart/form-data">
    <input type="file" name="file"><br> <!-- vscode 에서 지원하는 기능 -->
    <input type="submit" value="업로드">
</form>

(2) @RequestParam()이용

// UploadController.java //
    
    @PostMapping("/upload2")
    @ResponseBody
    public String upload2(@RequestParam("file") MultipartFile mFile) {
        String fileName = mFile.getOriginalFilename();
        long size = mFile.getSize();
        return fileName + size;
    }

 

(3) @ModelAttribute 이용

// UploadController.java //

    @PostMapping("/upload3")
    @ResponseBody
    public String upload3(@ModelAttribute FileInfo info) {
        String fileName = info.getFile().getOriginalFilename();
        long size = info.getFile().getSize();
        return fileName + size;
    }

3. 여러개의 파일 업로드 => 배열형태[] 로 설정

 // UploadController.java //
 
 	@GetMapping("/upload5")
    public String upload6() {
        return "upload5";
    }

    @PostMapping("/upload5")
    @ResponseBody
    public String upload6Post(MultipartHttpServletRequest mRequest) {
        String result = "";
        Iterator<String> fileNames = mRequest.getFileNames();
        while (fileNames.hasNext()) {                                   // hasNext() => boolean 형식 반환, next() => String 반환
            String fileName = fileNames.next();                         // 데이터를 한개씩 불러옴
            List<MultipartFile> mFiles = mRequest.getFiles(fileName);
            for (MultipartFile mFile : mFiles) {
                String oName = mFile.getOriginalFilename();
                long size = mFile.getSize();
                result += oName + " : " + size + "<br>";
            }
        }
        return result;
    }
// upload5.html //

<form method="post" enctype="multipart/form-data">
    <div id="input-files">
        <input type="file" name="file" multiple><br>
    </div>
    <button type="button">추가</button>
    <input type="submit" value="업로드">
</form>
<script>
    document.querySelector('button').addEventListener('click', () => {
        const div = document.querySelector('#input-files');
        const inputs = document.querySelectorAll('#input-files > input');
        const input = `<input type="file" name="file${inputs.length}" multiple>`;
        div.insertAdjacentHTML("afterbegin",input + "<br>")
    });
</script>

 

🔷 File Download 🔷

// DownloadController.java //

@Controller
public class DownloadController {
    @GetMapping("/download")
    public ResponseEntity<Resource> download() throws Exception {
        File file = new File("c:/study/lake.jpg");
        InputStreamResource resource = new InputStreamResource(new FileInputStream(file));
        return ResponseEntity.ok()
                .header("content-disposition",
                        "filename=" + URLEncoder.encode(file.getName(), "utf-8"))
                .contentLength(file.length())
                .contentType(MediaType.parseMediaType("application/octet-stream"))
                .body(resource);
    }
}

 

728x90
반응형
Contents

📝 포스팅 주소를 복사했습니다 📝

이 글이 도움이 되었다면 공감 부탁드립니다👍