본문으로 건너뛰기

파일(Files)#

Vapor는 라우트 핸들러 내에서 파일을 비동기적으로 읽고 쓸 수 있는 간단한 API를 제공합니다. 이 API는 NIO의 NonBlockingFileIO 타입 위에 구축되어 있습니다.

읽기(Read)#

파일을 읽기 위한 주요 메서드는 디스크에서 읽어들이는 동안 청크 단위로 콜백 핸들러에 전달합니다. 읽을 파일은 경로로 지정합니다. 상대 경로를 사용하면 프로세스의 현재 작업 디렉터리에서 찾습니다.

// Asynchronously reads a file from disk.
let readComplete: EventLoopFuture<Void> = req.fileio.readFile(at: "/path/to/file") { chunk in
    print(chunk) // ByteBuffer
}

// Or

try await req.fileio.readFile(at: "/path/to/file") { chunk in
    print(chunk) // ByteBuffer
}
// Read is complete

EventLoopFuture를 사용한다면, 반환된 future는 읽기가 완료되거나 에러가 발생했을 때 신호를 보냅니다. async/await를 사용한다면 await가 반환된 시점에 읽기가 완료된 것입니다. 에러가 발생한 경우에는 에러를 던집니다.

스트림(Stream)#

streamFile 메서드는 스트리밍되는 파일을 Response로 변환합니다. 이 메서드는 ETag, Content-Type과 같은 적절한 헤더를 자동으로 설정합니다.

// Asynchronously streams file as HTTP response.
req.fileio.streamFile(at: "/path/to/file").map { res in
    print(res) // Response
}

// Or

let res = req.fileio.streamFile(at: "/path/to/file")
print(res)

결과는 여러분의 라우트 핸들러에서 바로 반환할 수 있습니다.

수집(Collect)#

collectFile 메서드는 지정한 파일을 버퍼로 읽어들입니다.

// Reads the file into a buffer.
req.fileio.collectFile(at: "/path/to/file").map { buffer in 
    print(buffer) // ByteBuffer
}

// or

let buffer = req.fileio.collectFile(at: "/path/to/file")
print(buffer)

Warning

이 메서드는 파일 전체가 한 번에 메모리에 올라가야 합니다. 메모리 사용량을 제한하려면 청크 단위 읽기나 스트리밍 읽기를 사용하세요.

쓰기(Write)#

writeFile 메서드는 버퍼를 파일에 쓰는 것을 지원합니다.

// Writes buffer to file.
req.fileio.writeFile(ByteBuffer(string: "Hello, world"), at: "/path/to/file")

반환된 future는 쓰기가 완료되거나 에러가 발생했을 때 신호를 보냅니다.

미들웨어(Middleware)#

프로젝트의 Public 폴더에 있는 파일을 자동으로 제공하는 것에 대한 더 많은 정보는 미들웨어 → FileMiddleware를 참고하세요.

심화(Advanced)#

Vapor의 API가 지원하지 않는 경우에는 NIO의 NonBlockingFileIO 타입을 직접 사용할 수 있습니다.

// Main thread.
let fileHandle = try await app.fileio.openFile(
    path: "/path/to/file", 
    eventLoop: app.eventLoopGroup.next()
).get()
print(fileHandle)

// In a route handler.
let fileHandle = try await req.application.fileio.openFile(
    path: "/path/to/file", 
    eventLoop: req.eventLoop)
print(fileHandle)

더 많은 정보는 SwiftNIO의 API 참조 문서를 방문해 보세요.

이 페이지 편집