[Spring Boot] ํŒŒ์ผ ์—…๋กœ๋“œ ๋งŒ๋“ค๊ธฐ -4-

    ๋ฐ˜์‘ํ˜•

    https://lucete-stellae.tistory.com/80

     

    [Spring Boot] ํŒŒ์ผ ์—…๋กœ๋“œ ๋งŒ๋“ค๊ธฐ -3-

    https://lucete-stellae.tistory.com/78 ์ง€๋‚œ๋ฒˆ์— ์ด์–ด์„œ ํŒŒ์ผ ์—…๋กœ๋“œ ํ•จ์ˆ˜์— ๊ธฐ๋Šฅ์„ ์ถ”๊ฐ€ ํ•˜์˜€๋‹ค. 1. ํŒŒ์ผ ์—…๋กœ๋“œ ํ•จ์ˆ˜์˜ ๊ณตํ†ตํ™” 2. ํŒŒ์ผ ์˜ˆ์™ธ์ฒ˜๋ฆฌ (์‚ฌ์ด์ฆˆ,ํ™•์žฅ์ž) 3. ํŒŒ์ผ ์ด๋ฆ„ ์•”ํ˜ธํ™” 4. ํŒŒ์ผ ์ €์žฅ ์œ„์น˜๋ฅผ

    lucete-stellae.tistory.com

     

    ์ง€๋‚œ ๊ฒŒ์‹œ๊ธ€์— ์ด์–ด์„œ, ํŒŒ์ผ ์—…๋กœ๋“œ ๊ด€๋ จ ์ž‘์—…์„ ๋‹ค์‹œ ์ง„ํ–‰ํ–ˆ๋‹ค. ์ด๋ฒˆ์— ์ค‘์ ์„ ๋‘” ๊ฒƒ์€ ๋‹ค์ค‘ ํŒŒ์ผ ์—…๋กœ๋“œ ์ง€์›์ด๋‹ค.

    ํ•ด๋‹น ํŒŒ์ผ ์—…๋กœ๋“œ ๊ธฐ๋Šฅ์„ ๋‹ค๋ฅธ Boot ํ”„๋กœ์ ํŠธ์—์„œ ๊ฐ€์ ธ๋‹ค ์‚ฌ์šฉํ–ˆ๋Š”๋ฐ, ํ•ด๋‹น ์„œ๋น„์Šค์—์„œ๋Š” ํŒŒ์ผ ์—…๋กœ๋“œ ํ›„ ์—…๋กœ๋“œํ•œ ํŒŒ์ผ ๋ฆฌ์ŠคํŠธ๋ฅผ ๋ฆฌํ„ดํ•˜์—ฌ, ์ •๋ณด๋ฅผ ํ‘œํ˜„ํ•ด์ฃผ์–ด์•ผ ํ–ˆ๊ธฐ์— ์ด๋ฒˆ ๋‹ค์ค‘ ํŒŒ์ผ ์—…๋กœ๋“œ ํ•จ์ˆ˜์—์„œ๋Š” ํŒŒ์ผ ์ •๋ณด๋“ค์„ ๋ฆฌํ„ดํ•˜๋„๋ก ์ž‘์„ฑํ•˜์˜€๋‹ค.

     

    - FileUploadController.java

    @PostMapping("/upload4.do")
        public HashMap upload4(@RequestParam MultipartFile[] files) {
            System.out.println("๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ [LOG] : " + files + "๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ๏ผƒ");
            return fsvc.save4(files);
        }

     

    ๊ธฐ์กด MultipartRequest ๋ฅผ ๋ฐ›๋˜ ๊ฒƒ๊ณผ๋Š” ๋‹ฌ๋ฆฌ, Multipart ํŒŒ์ผ ๋ฐฐ์—ด์„ @RequestParam์„ ํ†ตํ•ด ์ „๋‹ฌ๋ฐ›๋Š”๋‹ค.

     

    - FIleUploadService.java

    @Override
        public HashMap save4(MultipartFile[] files) {
            // ์ตœ์ข… ๊ฒฐ๊ณผ ๋‹ด์„ ๋งต ๊ฐ์ฒด
            HashMap result = new HashMap();
            // ์—…๋กœ๋“œ๋œ ํŒŒ์ผ ๋ฆฌ์ŠคํŠธ ๊ฐ์ฒด
            List<HashMap> uploadFileList = new ArrayList<HashMap>();
            // ์—…๋กœ๋“œ ๊ฒฝ๋กœ ์„ค์ •
            Path uploadPath = fu.getUploadPath("image");
            // ๋‹ค์ค‘ ํŒŒ์ผ ์—…๋กœ๋“œ ๊ด€๋ฆฌ๋ฅผ ์œ„ํ•œ master file seq
            int masterSeq = fu.getMasterSeq();
            // Array ๋ฐ˜๋ณต ํ•˜์—ฌ ํŒŒ์ผ ์—…๋กœ๋“œ ์‹คํ–‰
            Arrays.asList(files).stream().forEach(file -> {
                uploadFileList.add(fu.multipleUpload(file, uploadPath, masterSeq));
            });
            // ๊ฒฐ๊ณผ๋ฅผ ๋‹ด์•„ result ๋ฆฌํ„ด.
            result.put("fileMasterSeq", masterSeq);
            result.put("uploadFileList", uploadFileList);
            return result;
        }

     

    ์„œ๋น„์Šค์—์„œ๋Š” ํŒŒ์ผ ๋ฐฐ์—ด์„ ๋ฐ›์•„, ๊ฐœ์ˆ˜ ๋งŒํผ ๋ฐ˜๋ณตํ•˜๋ฉฐ ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•˜๊ณ , ๊ฐ ํŒŒ์ผ์„ ์—…๋กœ๋“œ ํ•จ์œผ๋กœ์จ ๋ฆฌํ„ด๋˜๋Š” ํŒŒ์ผ ์ •๋ณด๋“ค์„ ๊ฐ์ฒด์— ๋‹ด์•„ ๋ฆฌํ„ดํ•˜๊ฒŒ๋” ํ•œ๋‹ค.

     

    - FIleUtil.java

    public HashMap<String, String> multipleUpload(MultipartFile file, Path path, int masterSeq) {
            HashMap result = new HashMap();
            // ํŒŒ์ผ ์ •๋ณด
            String fileName = file.getOriginalFilename();
            String fileSize = Long.toString(file.getSize());
            String fileExt = fileName.substring(fileName.lastIndexOf(".") + 1);
            String fileType = file.getContentType();
            String filePath = "";
            // ๊ฒฐ๊ณผ ์ •๋ณด
            String status = "";
            String message = "";
            String fileSeq = "";
            // ์˜ˆ์™ธ์ฒ˜๋ฆฌ ํ•˜๊ธฐ
    
            // 1. ํŒŒ์ผ ์‚ฌ์ด์ฆˆ
            if (file.getSize() > MAX_SIZE) {
                status = "fail";
                message = "file over max upload size";
                result.put("status", status);
                result.put("message", message);
                return result;
            }
    
            // 2. ํŒŒ์ผ ํ™•์žฅ์ž
            // ํ™”์ดํŠธ ๋ฆฌ์ŠคํŠธ ๋ฐฉ์‹์œผ๋กœ ํŒŒ์ผ ํ™•์žฅ์ž ์ฒดํฌ
            if (!Arrays.asList("jpg", "png", "gif", "jpeg", "bmp", "xlsx", "ppt", "pptx", "txt", "hwp")
                    .contains(fileExt.toLowerCase())) {
                status = "fail";
                message = "file type is not allowed";
                result.put("status", status);
                result.put("message", message);
                return result;
            }
    
            // 3. ์ €์žฅ ํŒŒ์ผ ์ด๋ฆ„ ๋žœ๋คํ™”
            String tempName = fileName.substring(0, fileName.lastIndexOf("."));
            String encFileName = Base64.getEncoder().encodeToString(tempName.getBytes());
            // ์•”ํ˜ธํ™”๋œ ๊ฒฝ๋กœ๋กœ ํŒจ์Šค ์„ค์ •
            filePath = path.toString() + File.separator + encFileName + "." + fileExt;
    
            // 4. ํŒŒ์ผ์ •๋ณด ๋งต์— ๋‹ด๊ธฐ.
            HashMap fileInfo = new HashMap<String, String>();
            HashMap<String, String> uploadedFileInfo = new HashMap<String, String>();
    
            fileInfo.put("fileName", fileName);
            fileInfo.put("encFileName", encFileName);
            fileInfo.put("fileSize", fileSize);
            fileInfo.put("fileExt", fileExt);
            fileInfo.put("fileType", fileType);
            fileInfo.put("filePath", filePath);
            fileInfo.put("fileMasterSeq", masterSeq);
    
            try {
                InputStream is = file.getInputStream();
                Files.copy(is, path.resolve(encFileName + "." + fileExt), StandardCopyOption.REPLACE_EXISTING);
    
                // ํŒŒ์ผ ์ €์žฅ์— ์„ฑ๊ณตํ•˜๋ฉด DB์— ์ €์žฅํ•˜๊ธฐ
                fileSeq = Integer.toString(rpt.insertFile(fileInfo));
                uploadedFileInfo = rpt.info(Integer.parseInt(fileSeq));
    
                status = "success";
                message = "upload complete";
    
            } catch (Exception e) {
                e.printStackTrace();
                status = "fail";
                message = "upload fail";
            }
            result.put("status", status);
            result.put("message", message);
            result.put("fileMasterSeq", masterSeq);
            result.put("fileInfo", uploadedFileInfo);
            return result;
        }

     

    ์‹ค์ œ ์—…๋กœ๋“œ ํ•˜๋Š” ํ•จ์ˆ˜์ด๋‹ค. ๊ธฐ์กด๊ณผ ๋‹ค๋ฅธ ์ ์€, ์—ฌ๋Ÿฌ๊ฐœ์˜ ํŒŒ์ผ์„ ํ•œ ์š”์ฒญ์— ์˜ํ•ด ์˜ฌ๋ฆฐ๊ฒƒ์„ ํ‘œ์‹œ ๋ฐ ๋‹ค๋ฅธ ๋ฐ์ดํ„ฐ์™€ ์—ฐ๋™์‹œ์— ๊ทธ๋ฃน์œผ๋กœ ์ฐพ๊ธฐ ์‰ฝ๋„๋ก file_master ํ…Œ์ด๋ธ”์„ ์ถ”๊ฐ€ํ•˜๊ณ , master_seq ๋ฅผ ๊ฐ€์ง€๋„๋ก ํ•˜์—ฌ ํŒŒ์ผ๊ฐ„ ๊ทธ๋ฃน์„ ๊ตฌ๋ถ„ ํ–ˆ๋‹ค๋Š” ๊ฒƒ์ด๋‹ค.

    ์ด๋ ‡๊ฒŒํ•˜๋ฉด ์‚ฌ์šฉ์ž๊ฐ€ ํŒŒ์ผ์—…๋กœ๋“œ๋ฅผ ํ• ๋•Œ ์ผ๋ฐ˜์ ์ธ ๊ฒŒ์‹œํŒ์ด๋ผ๊ณ  ํ•œ๋‹ค๋ฉด, ๊ฒŒ์‹œํŒ์—์„œ ์—ฌ๋Ÿฌ ๊ฐœ ํ˜น์€ ๋‹จ์ผ ํŒŒ์ผ์—…๋กœ๋“œ ์‹œ ๋ฐœ์ƒํ•œ master_seq ๋ฅผ ๊ฐ€์ง€๊ณ  ์žˆ์œผ๋ฉด ํ•ด๋‹น ๊ฒŒ์‹œ๊ธ€ ์ž‘์„ฑ ์‹œ, ์—…๋กœ๋“œ ๋œ ๋ชจ๋“  ํŒŒ์ผ ์ •๋ณด๋ฅผ ์กฐํšŒํ•  ์ˆ˜ ์žˆ๋‹ค.

     

    ํ•ด๋‹น ํ”„๋กœ์ ํŠธ๋Š” ์•„๋ž˜์—์„œ ๋‹ค์šด๋กœ๋“œ๊ฐ€ ๊ฐ€๋Šฅํ•˜๋‹ค.

     

    https://github.com/Chiptune93/spring-example/tree/main/FileUpload

     

    GitHub - Chiptune93/spring-example: Spring Example

    Spring Example. Contribute to Chiptune93/spring-example development by creating an account on GitHub.

    github.com

     

     

     

     

     

     

    728x90
    ๋ฐ˜์‘ํ˜•

    ๋Œ“๊ธ€