Ga naar inhoud

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.