ファイル¶
Vaporは、ルートハンドラ内でファイルを非同期に読み書きするためのシンプルなAPIを提供しています。このAPIは、NIOのNonBlockingFileIO
型の上に構築されています。
読み取り¶
ファイルを読み取るための主要なメソッドは、ディスクから読み取られたチャンクをコールバックハンドラに配信します。読み取るファイルはパスで指定します。相対パスは、プロセスの現在の作業ディレクトリを参照します。
// ディスクからファイルを非同期に読み取ります。
let readComplete: EventLoopFuture<Void> = req.fileio.readFile(at: "/path/to/file") { chunk in
print(chunk) // ByteBuffer
}
// または
try await req.fileio.readFile(at: "/path/to/file") { chunk in
print(chunk) // ByteBuffer
}
// 読み取り完了
EventLoopFuture
を使用している場合、返されたfutureは読み取りが完了したか、エラーが発生したときにシグナルを送ります。async
/await
を使用している場合、await
が返ると読み取りが完了しています。エラーが発生した場合は、エラーをスローします。
ストリーム¶
streamFile
メソッドは、ストリーミングファイルをResponse
に変換します。このメソッドは、ETag
やContent-Type
などの適切なヘッダーを自動的に設定します。
// ファイルを非同期にHTTPレスポンスとしてストリームします。
req.fileio.streamFile(at: "/path/to/file").map { res in
print(res) // Response
}
// または
let res = req.fileio.streamFile(at: "/path/to/file")
print(res)
結果は、ルートハンドラから直接返すことができます。
収集¶
collectFile
メソッドは、指定されたファイルをバッファに読み込みます。
// ファイルをバッファに読み込みます。
req.fileio.collectFile(at: "/path/to/file").map { buffer in
print(buffer) // ByteBuffer
}
// または
let buffer = req.fileio.collectFile(at: "/path/to/file")
print(buffer)
Warning
このメソッドは、ファイル全体を一度にメモリに読み込む必要があります。メモリ使用量を制限するには、チャンクまたはストリーミング読み取りを使用してください。
書き込み¶
writeFile
メソッドは、バッファをファイルに書き込むことをサポートしています。
// バッファをファイルに書き込みます。
req.fileio.writeFile(ByteBuffer(string: "Hello, world"), at: "/path/to/file")
返されたfutureは、書き込みが完了したか、エラーが発生したときにシグナルを送ります。
ミドルウェア¶
プロジェクトの_Public_フォルダから自動的にファイルを提供する方法の詳細については、ミドルウェア → FileMiddlewareを参照してください。
高度な使い方¶
VaporのAPIがサポートしていないケースでは、NIOのNonBlockingFileIO
型を直接使用できます。
// メインスレッド。
let fileHandle = try await app.fileio.openFile(
path: "/path/to/file",
eventLoop: app.eventLoopGroup.next()
).get()
print(fileHandle)
// ルートハンドラ内。
let fileHandle = try await req.application.fileio.openFile(
path: "/path/to/file",
eventLoop: req.eventLoop)
print(fileHandle)
詳細については、SwiftNIOのAPIリファレンスをご覧ください。