개발_기초 정보

[Servlet] 파일 업로드

메타듀 2023. 2. 21. 13:41
728x90
반응형

파일 업로드를 위한 환경 설정

web.xml 에 Tomcat 파일 업로드 처리를 위한 config 환경 설정 한다.

<multipart-config>
    <location>D:\\upload\\temp</location> 
        <!-- 첨부파일이 올라가는 폴더 -->
    <max-file-size>20971520</max-file-size> 
        <!--1MB * 20 파일 하나 최대 크기-->
    <max-request-size>41943040</max-request-size>
        <!-- 40MB 모든 파일 최대 크기-->
    <file-size-threshold>20971520</file-size-threshold>
        <!-- 20MB  이 사이즈가 넘어가면 파일로 처리할거야-->
</multipart-config>

servlet-context.xml

<!-- multipartResolver-->
<bean id="multipartResolver"
     class="org.springframework.web.multipart.support.StandardServletMultipartResolver">
</bean>

이미지 등록 시 섬네일을 만들기 위한 라이브러리도 추가!

 // 썸네일 https://mvnrepository.com/artifact/net.coobird/thumbnailator
    implementation 'net.coobird:thumbnailator:0.4.17'

JSP, JS

<form action="/upload" method="post" enctype="multipart/form-data">             
    <input type="file" name="files" multiple> 
    <button>Upload</button>

</form>

이미지 첨부시 반드시 enctype="multipart/form-data"지정해줘야 한다.
이름은 파라미터 타입과 같이 맞춰주어야 한다.
input file 에 multiple을 추가하면 한번에 여러개 업로드가 가능하다.

controller

@ResponseBody 이것을 붙임으로 list를 보내준다.

    @ResponseBody
    @PostMapping("/upload")              //여러개의 파일을 받고 싶을 때는 배열로 처리한다.
    public List<UploadResultDTO> upload1(MultipartFile[] files){
        //log.info("----------file---------: "+files);

        List<UploadResultDTO> list = new ArrayList<>();

        //파일 업로드
        for(MultipartFile file:files){
                   // 업로드 되는 파일 이름
            String originalFileName = file.getOriginalFilename();

            boolean img = file.getContentType().startsWith("image"); //이미지 여부
            //썸네일을 위해 타입을 읽어서 
            //이미지 타입이라면 썸네일을 만들 수 있도록 한다.

            String uuid = UUID.randomUUID().toString();
            String saveName = uuid+"_"+originalFileName;
                   //최종적으로 저장되는 파일 이름, 중복을 방지하기 위해서 UUID 를 사용한다.

            String saveFolder = makeFolders();
            //날짜별로 첨부파일 정리하기


            //전체 경로
            File saveFile = new File("D:\\upload\\"+saveFolder+"\\"+saveName);

            // 서버까지 파일 업로드가 된 상태... 이제 저장을 해야하는데!
            try (InputStream in = file.getInputStream();
                 FileOutputStream fos =
                         new FileOutputStream(saveFile);
            ) {
                FileCopyUtils.copy(in, fos);

            } catch (IOException e) {
                e.printStackTrace();
            }

            //만약 이미지인 경우 썸네일 만들기
            if(img){
                String thumbFileName = saveFolder+"\\s_"+saveName;
                File thumbFile = new File("D:\\upload\\"+thumbFileName);

                try {
                    Thumbnails.of(saveFile)
                            .size(200, 200)
                            .toFile(thumbFile);
                } catch (IOException e) {
                    e.printStackTrace();
                }
            }//end if(boolean img)

            list.add(UploadDTO.builder()
                            .original(originalFileName)
                            .uuid(uuid)
                            .savePath(saveFolder)
                            .img(img)
                    .build());
        }//end for

        return list;

    }//end upload1
  • 날짜별로 첨부파일 정리하기
    폴더의 경로 날짜 별로 정리할 수 있도록 날짜별 폴더를 만들어준다.
    폴더가 있었으면 안만들어지고, 기본에 있던 폴더로 들어간다.
  • private String makeFolders(){ SimpleDateFormat sdf = new SimpleDateFormat("yyyy/MM/dd"); String str = sdf.format(new Date()); //java.util 로! File folderPath = new File("D:\\upload\\"+str); //이 경로가 존재하지 않는다면! 만들기 if(!folderPath.exists()){ folderPath.mkdirs(); } return str; }
반응형