• [Apache PDFBox] 코틀린 임시파일 및 내용 생성
    언어/Kotlin 2024. 6. 3. 09:52
    반응형

     어떤 이미지나 내용으로 PDF를 만들기 위해서 이미지나 내용을 저장할 저장소가 필요하다. 저장소는 메모리일 수도 있고, HDD와 같은 물리적 저장장치일 수도 있다. 메모리에 저장해서 사용하는 것이 편리하겠지만, 메모리의 용량은 한정적이므로, 하드웨어에 저장했다가 일정부분씩 읽어 처리한다.

     

    1.  로컬 - 임시파일 생성

    로컬의 test.csv파일을 읽어, 임시파일에 저장한다.

     
    import java.io.File
    import java.io.IOException
    
    fun main() {
        try {
          // 바탕화면에 있는 파일
          val testFile = File("/Users/onestone/Desktop/test.csv")
    		
          // temp_를 prefix로 하고, 확장자가 csv인 임시파일 생성
          val temp = File.createTempFile("temp_", ".csv")
          val bufferedWriter = temp.bufferedWriter()
    
          testFile.bufferedReader().use { bufferedReader ->
              bufferedReader.forEachLine { 
                  bufferedWriter.write(it) 
                  bufferedWriter.newLine()
              }
          }
    		
          // 파일의 마지막 라인에 endLine--- 추가
          bufferedWriter.use { it.write("endLine---") }
        } catch (e: IOException) {
            println(e)
        }
    }

     

    이렇게 로컬파일을 읽어서 새로운 파일을 만들어주는 경우도 있지만, 외부에서 파일을 업로드해주는 경우도 있다.

     

     

     

    2.  스프링웹 - 임시파일 생성

    Controller를 통해 외부에서 file을 전달받는다.

    // FileUploadController.class
    
    import org.example.fileuploadspring.service.FileUploadService
    import org.springframework.web.bind.annotation.PostMapping
    import org.springframework.web.bind.annotation.RequestMapping
    import org.springframework.web.bind.annotation.RequestParam
    import org.springframework.web.bind.annotation.RestController
    import org.springframework.web.multipart.MultipartFile
    
    @RestController
    @RequestMapping("/v1", name = "파일 업로드")
    class FileUploadController(private val fileUploadService: FileUploadService) {
        @PostMapping("/files/upload", name = "업로드")
        fun requestUpload(@RequestParam file: MultipartFile): Boolean {
            return fileUploadService.upload(file)
        }
    }

     

     

    Service에서 MultipartFile을 BufferedInputStream으로 변환한다.

    // FileUploadService.class
    
    import org.springframework.stereotype.Service
    import org.springframework.web.multipart.MultipartFile
    import java.io.BufferedInputStream
    import java.io.File
    import java.io.IOException
    
    @Service
    class FileUploadService {
        fun upload(file: MultipartFile): Boolean {
            try {
                BufferedInputStream(file.inputStream).use { bufferedInputStream ->
                
                val temp = File.createTempFile("temp_", ".csv")
                val bufferedWriter = temp.bufferedWriter()
    
                    bufferedInputStream.bufferedReader().use { bufferedReader ->
                        bufferedReader.forEachLine { 
                            bufferedWriter.write(it) 
                            bufferedWriter.newLine()
                        }
                    }
    
                    bufferedWriter.use { it.write("endLine---") }
                }
            } catch (e: IOException) {
                println(e)
            }
    
            return true
        }
    }

     

    application.yaml 파일 10MB까지 업로드 가능하도록 설정한다.

    # application.yaml
    # 기본값은 1048576 bytes = 1MB
    
    spring:
      servlet:
        multipart:
          maxFileSize: 10MB
          maxRequestSize: 10MB

     

    포스트맨으로 파일을 전달해서 잘 돌아가는지 확인해본다.

     

    반응형

    댓글

Designed by Tistory.