언어/Kotlin
[Apache PDFBox] 코틀린 임시파일 및 내용 생성
원석💎-dev
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
포스트맨으로 파일을 전달해서 잘 돌아가는지 확인해본다.

반응형