Bestanden¶
Vapor biedt een eenvoudige API voor het asynchroon lezen en schrijven van bestanden binnen route handlers. Deze API is gebouwd op NIO's NonBlockingFileIO
type.
Lezen¶
De primaire methode voor het lezen van een bestand levert chunks aan een callback handler terwijl ze van de schijf worden gelezen. Het te lezen bestand wordt gespecificeerd door zijn pad. Relatieve paden zoeken in de huidige werkdirectory van het proces.
// Leest asynchroon een bestand van schijf.
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
}
// Lezen is voltooid
Bij gebruik van EventLoopFuture
zal de geretourneerde future signaleren wanneer het lezen voltooid is of dat er een fout is opgetreden. Als async
/await
gebruikt wordt, dan zal zodra de await
teruggekeerd is, het lezen voltooid zijn. Als er een fout is opgetreden zal er een foutmelding worden gegeven.
Stream¶
De streamFile
methode verpakt de stream in een Response
. Deze methode stelt automatisch de juiste headers in, zoals ETag
en Content-Type
.
// Streamt asynchroon bestand als HTTP antwoord.
req.fileio.streamFile(at: "/path/to/file").map { res in
print(res) // Antwoord
}
// Of
let res = req.fileio.streamFile(at: "/path/to/file")
print(res)
Het resultaat kan direct door je route handler worden teruggegeven.
Collect¶
De collectFile
methode leest het opgegeven bestand in een buffer.
// Leest het bestand in een buffer.
req.fileio.collectFile(at: "/path/to/file").map { buffer in
print(buffer) // ByteBuffer
}
// of
let buffer = req.fileio.collectFile(at: "/path/to/file")
print(buffer)
Waarschuwing
Deze methode vereist dat het hele bestand in één keer in het geheugen aanwezig is. Gebruik "chunked" of "streaming read" om het geheugengebruik te beperken.
Schrijven¶
De writeFile
methode ondersteunt het schrijven van een buffer naar een bestand.
// Schrijft buffer naar bestand.
req.fileio.writeFile(ByteBuffer(string: "Hello, world"), at: "/path/to/file")
De geretourneerde future zal signaleren wanneer het schrijven voltooid is of dat er een fout is opgetreden.
Middleware¶
Voor meer informatie over het automatisch serveren van bestanden uit de Public map van je project, zie Middleware → FileMiddleware.
Geavanceerd¶
Voor gevallen die Vapor's API niet ondersteunt, kunt u NIO's NonBlockingFileIO
type direct gebruiken.
// Main thread.
let fileHandle = try await app.fileio.openFile(
path: "/path/to/file",
eventLoop: app.eventLoopGroup.next()
).get()
print(fileHandle)
// In een route handler.
let fileHandle = try await req.application.fileio.openFile(
path: "/path/to/file",
eventLoop: req.eventLoop)
print(fileHandle)
Ga voor meer informatie naar SwiftNIO's API referentie.