[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
๋ฐ˜์‘ํ˜•

๋Œ“๊ธ€