반응형

전자정부프레임워크를 활용하여 파일 업로드와 다운로드 기능을 구현하는 방법을 학습합니다. 이 기능은 사용자로부터 파일을 수집하거나, 저장된 파일을 제공하는 웹 애플리케이션에서 매우 중요한 역할을 합니다.


1. 파일 업로드 구현

1-1. 라이브러리 설정

전자정부프레임워크에서는 파일 업로드를 위해 Apache Commons FileUpload 라이브러리를 사용합니다. 이 라이브러리가 포함되어 있는지 확인합니다.

pom.xml

<dependency>
    <groupId>commons-fileupload</groupId>
    <artifactId>commons-fileupload</artifactId>
    <version>1.4</version>
</dependency>

1-2. 파일 저장 경로 설정

파일이 저장될 디렉터리를 설정합니다.

  • 경로: /uploads
  • 실제 위치: src/main/webapp/uploads

application.properties (Spring Boot 기반)

file.upload.dir=uploads/

1-3. 컨트롤러 작성

파일 업로드를 처리하는 컨트롤러입니다.
FileUploadController.java

@Controller
@RequestMapping("/file")
public class FileUploadController {
    @Value("${file.upload.dir}")
    private String uploadDir;

    @PostMapping("/upload")
    public String uploadFile(@RequestParam("file") MultipartFile file, Model model) {
        if (file.isEmpty()) {
            model.addAttribute("message", "파일을 선택해주세요.");
            return "uploadForm";
        }

        try {
            String filePath = uploadDir + file.getOriginalFilename();
            File dest = new File(filePath);
            file.transferTo(dest);
            model.addAttribute("message", "파일 업로드 성공: " + file.getOriginalFilename());
        } catch (IOException e) {
            model.addAttribute("message", "파일 업로드 실패: " + e.getMessage());
        }

        return "uploadResult";
    }
}

1-4. 업로드 화면 작성

uploadForm.jsp

<form action="/file/upload" method="post" enctype="multipart/form-data">
    <label for="file">파일 선택:</label>
    <input type="file" id="file" name="file">
    <button type="submit">업로드</button>
</form>

uploadResult.jsp

<p>${message}</p>

2. 파일 다운로드 구현

2-1. 컨트롤러 작성

파일 다운로드를 처리하는 컨트롤러입니다.
FileDownloadController.java

@Controller
@RequestMapping("/file")
public class FileDownloadController {
    @Value("${file.upload.dir}")
    private String uploadDir;

    @GetMapping("/download/{fileName}")
    public ResponseEntity<Resource> downloadFile(@PathVariable String fileName) {
        try {
            File file = new File(uploadDir + fileName);
            if (!file.exists()) {
                throw new FileNotFoundException("파일을 찾을 수 없습니다: " + fileName);
            }

            Path filePath = file.toPath();
            Resource resource = new UrlResource(filePath.toUri());

            return ResponseEntity.ok()
                    .header(HttpHeaders.CONTENT_DISPOSITION, "attachment; filename=\"" + file.getName() + "\"")
                    .body(resource);
        } catch (Exception e) {
            return ResponseEntity.status(HttpStatus.NOT_FOUND)
                    .body(null);
        }
    }
}

2-2. 다운로드 링크 생성

downloadPage.jsp

<a href="/file/download/sample.txt">sample.txt 다운로드</a>

3. 테스트 및 결과 확인

3-1. 업로드 테스트

  1. /file/upload로 접속합니다.
  2. 파일을 선택하고 업로드 버튼을 클릭합니다.
  3. 업로드 성공 메시지가 나타나고 파일이 /uploads 디렉터리에 저장됩니다.

3-2. 다운로드 테스트

  1. /file/download/sample.txt로 접속합니다.
  2. 브라우저에서 파일이 다운로드됩니다.

4. 파일 관리 시 유의사항

  1. 파일 이름 중복 방지
    업로드 파일 이름에 타임스탬프나 UUID를 추가하여 중복 파일 이름 문제를 방지합니다.
  2. 보안
    • 사용자가 파일 경로를 조작하지 못하도록 입력값 검증을 철저히 수행합니다.
    • 업로드 가능한 파일 형식을 제한합니다.
  3. 파일 크기 제한
    MultipartResolver를 통해 최대 파일 크기를 제한합니다.
    <bean id="multipartResolver" class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
        <property name="maxUploadSize" value="10485760" /> <!-- 10MB -->
    </bean>
    
  4. 파일 삭제 기능 제공
    업로드된 파일을 관리할 수 있도록 삭제 기능을 추가합니다.

5. 마무리

오늘 학습한 파일 업로드 및 다운로드 기능은 다양한 웹 애플리케이션에서 활용할 수 있는 핵심적인 기능입니다. 다음에서는 로그 기능과 예외 처리를 구현하는 방법을 학습합니다.

 

반응형

+ Recent posts