Programming > Spring Framework

[spring framework] file upload (MultipartFile, fetch) 파일업로드 하기

Library 설정

<!-- 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>

Bean 로딩 (CommonsMultipartResolver)

@Bean(name = "multipartResolver")
public CommonsMultipartResolver multipartResolver() {
    CommonsMultipartResolver multipartResolver = new CommonsMultipartResolver();
    multipartResolver.setMaxUploadSize(1000000000); // byte
    return multipartResolver;
}

HTML file upload (javascript fetch 사용 샘플)

<input type="file"/>
<input type="file"/>
<input type="file"/>
<button onclick="goFile()">upload</button>
<script>
async function goFile(){
    const formData = new FormData();

 

※ 파일 하나만 올릴경우
    const fileField = document.querySelector('input[type="file"]');
    formData.append('file', fileField.files[0]);

 

   ※ 파일 여러개 올릴경우
    let elems = document.querySelectorAll('input[type="file"]');
    elems.forEach(function(value,index,arr){
        formData.append('file', value.files[0]);
    });

    fetch("/file/upload", {
         method: 'POST',
         body: formData
    })
    .then((response) => response.json())
    .then((result) => {
      console.log('Success:', result);
    })
    .catch((error) => {
      console.error('Error:', error);
    });
}
</script>

java Controller

@SuppressWarnings("unchecked")
@RequestMapping(value = "/upload")
@ResponseBody
public <T> T fileUpload(@RequestParam("file") MultipartFile[] files, HttpServletRequest req,  Model model) {
   
    Map<String, String> map = new HashMap<String, String>();
    map.put("result", "failed!!");

    for (int i = 0; i < files.length; i++) {
        MultipartFile file = files[i];
        String name = file.getOriginalFilename();
        try {
            byte[] bytes = file.getBytes();

            File dir = new File("D:/logs");
            if (!dir.exists())
                dir.mkdirs();

            File serverFile = new File(dir.getAbsolutePath() + File.separator + name);
            BufferedOutputStream stream = new BufferedOutputStream(new FileOutputStream(serverFile));
            stream.write(bytes);
            stream.close();

        } catch (Exception e) {
            return (T)map;
        }
    }
    map.put("result", "success");

    return (T)map;

}