Front-end

PDF 다중 업로드 & 미리보기

jki09871 2025. 2. 18. 11:32
웹 애플리케이션에서 여러 개의 PDF 파일을 업로드하고 미리보기할 수 있도록 구현한 최종 코드를 소개합니다. 이 코드에서는 PDF가 아닌 파일을 선택하면 자동으로 제거하고, 유효한 파일만 유지하여 미리보기를 제공하며, AJAX를 통해 서버로 업로드할 수 있도록 구성되었습니다.

✅ 1. HTML + jQuery (프론트엔드 코드)

<!DOCTYPE html>
<html lang="ko">
<head>
    <meta charset="UTF-8">
    <title>PDF 다중 업로드 & 미리보기</title>
    <script src="https://code.jquery.com/jquery-3.6.0.min.js"></script>
</head>
<body>
    <h2>PDF 다중 업로드 및 미리보기</h2>

    <!-- 파일 업로드 폼 -->
    <input type="file" id="fileInput" name="pdfFiles[]" multiple>
    <button id="uploadBtn">업로드</button>

    <!-- 미리보기 영역 -->
    <div id="previewContainer"></div>

    <script>
        $(document).ready(function() {
            $("#fileInput").on("change", function(event) {
                $("#previewContainer").empty(); // 기존 미리보기 삭제

                var files = event.target.files;
                var validFiles = []; // 유효한 PDF만 저장할 배열
                var dataTransfer = new DataTransfer(); // 새 파일 리스트 생성

                $.each(files, function(index, file) {
                    if (file.type !== "application/pdf") {
                        alert("PDF 파일만 선택 가능합니다.");
                    } else {
                        validFiles.push(file);
                        dataTransfer.items.add(file); // 유효한 파일만 추가
                    }
                });

                // 유효한 파일만 input 요소에 다시 설정
                $("#fileInput")[0].files = dataTransfer.files;

                // 유효한 파일만 미리보기
                $.each(validFiles, function(index, file) {
                    var fileURL = URL.createObjectURL(file);
                    var iframe = $("<iframe>", {
                        src: fileURL,
                        width: "500",
                        height: "600",
                        class: "pdf-preview",
                        css: { "margin-bottom": "10px" }
                    });

                    $("#previewContainer").append(iframe);
                });
            });

            // 파일 업로드 버튼 클릭 시
            $("#uploadBtn").on("click", function() {
                var formData = new FormData();
                var files = $("#fileInput")[0].files;

                if (files.length === 0) {
                    alert("파일을 선택해주세요.");
                    return;
                }

                $.each(files, function(index, file) {
                    formData.append("pdfFiles", file);
                });

                $.ajax({
                    url: "/upload",
                    type: "POST",
                    data: formData,
                    processData: false,
                    contentType: false,
                    success: function(response) {
                        alert("파일 업로드 성공!");
                        console.log(response);
                    },
                    error: function(xhr) {
                        alert("파일 업로드 실패: " + xhr.responseText);
                    }
                });
            });
        });
    </script>
</body>
</html>

✅ 2. 코드 상세 설명

1️⃣ PDF 파일 검증 및 선택 제한

  • 사용자가 파일을 선택하면 change 이벤트가 발생.
  • file.type !== "application/pdf"인 경우, 경고 메시지를 띄우고 추가하지 않음.
  • dataTransfer 객체를 활용해 유효한 PDF만 유지한 채 input에 다시 설정.

2️⃣ PDF 미리보기 기능

  • URL.createObjectURL(file)을 사용하여 각 PDF를 미리보기할 수 있도록 URL을 생성.
  • 동적으로 <iframe> 요소를 만들어 미리보기 영역에 추가.
  • css: { "margin-bottom": "10px" }을 적용하여 PDF 간격 조정.

3️⃣ 파일 업로드 기능 (AJAX 활용)

  • FormData 객체를 사용해 선택된 모든 PDF 파일을 서버로 전송.
  • processData: false, contentType: false 설정을 통해 multipart/form-data로 전송 가능하도록 처리.
  • 업로드 성공 시 alert("파일 업로드 성공!")을 띄우고, 응답을 콘솔에 출력.

✅ 3. Spring Boot (백엔드 코드)

import org.springframework.http.ResponseEntity;
import org.springframework.web.bind.annotation.*;
import org.springframework.web.multipart.MultipartFile;
import java.io.File;
import java.io.IOException;
import java.util.List;

@RestController
public class FileUploadController {

    @PostMapping("/upload")
    public ResponseEntity<?> uploadMultipleFiles(@RequestParam("pdfFiles") List<MultipartFile> files) {
        try {
            for (MultipartFile file : files) {
                String fileName = file.getOriginalFilename();
                File saveFile = new File("uploads/" + fileName);
                file.transferTo(saveFile); // 파일 저장
            }
            return ResponseEntity.ok("파일 업로드 성공");
        } catch (IOException e) {
            return ResponseEntity.status(500).body("파일 업로드 실패: " + e.getMessage());
        }
    }
}

✅ 4. 코드 설명 (백엔드)

1️⃣ 다중 파일 업로드 처리

  • List<MultipartFile>을 사용해 여러 개의 파일을 한 번에 받음.
  • for 루프를 돌며 각 파일을 uploads/ 디렉토리에 저장.

2️⃣ 응답 처리

  • 파일 저장 성공 시 ResponseEntity.ok("파일 업로드 성공") 반환.
  • 오류 발생 시 500 INTERNAL SERVER ERROR 상태와 함께 에러 메시지 반환.

✅ 5. 기대 결과

개선된 기능

✅ PDF 파일만 선택 가능 (다른 파일 자동 제외)
✅ 선택한 PDF 파일 미리보기 지원 (iframe 활용)
✅ AJAX를 통한 다중 파일 업로드 가능
✅ Spring Boot 백엔드에서 파일을 저장하고 응답 반환

이제 위 코드를 적용하면 여러 개의 PDF 파일을 업로드하고 미리보기를 제공하는 기능을 완벽하게 구현할 수 있습니다!