Fichiers#
Vapor offre une API simple pour la lecture et l’écriture asynchrone de fichiers dans les contrôleurs. Cette API est construite sur le type NonBlockingFileIO de NIO.
Lecture#
Par extraits successifs#
La principale méthode exposée pour la lecture de fichier envoie des extraits vers un callback au fur et à mesure de leur lecture sur le disque. Le fichier à lire est indiqué par son chemin. Les chemins relatifs chercheront dans le répertoire de travail courant du processus en cours.
// Lecture asynchrone d'un fichier sur le disque.
let readComplete: EventLoopFuture<Void> = req.fileio.readFile(at: "/chemin/vers/le/fichier") { chunk in
print(chunk) // ByteBuffer
}
// Ou
try await req.fileio.readFile(at: "/chemin/vers/le/fichier") { chunk in
print(chunk) // ByteBuffer
}
// Lecture terminée
Si vous utilisez des EventLoopFutures, le futur retourné indiquera la fin de la lecture ou l’arrivée d’une erreur. Si vous utilisez async/await, alors la lecture sera terminée lorsque await aura fini son attente. En cas d’erreur, elle sera levée.
Par diffusion de flux#
La méthode streamFile convertit un flux de lecture de fichier en objet Response. Cette méthode ajoutera les entêtes appropriées comme ETag et Content-Type automatiquement.
// Diffuse de façon asynchrone un fichier en réponse HTTP.
req.fileio.streamFile(at: "/chemin/vers/le/fichier").map { res in
print(res) // Response
}
// Ou
let res = req.fileio.streamFile(at: "/chemin/vers/le/fichier")
print(res)
Le résultat peut être retourné directement depuis votre contrôleur.
Par mise en mémoire#
La méthode collectFile lit le fichier indiqué et le stoque en mémoire.
// Place le contenu du fichier lu dans un buffer.
req.fileio.collectFile(at: "/chemin/vers/le/fichier").map { buffer in
print(buffer) // ByteBuffer
}
// ou
let buffer = req.fileio.collectFile(at: "/chemin/vers/le/fichier")
print(buffer)
Attention
Cette méthode nécessite le stoquage intégral du fichier en mémoire. Préférez une lecture en diffusion par flux ou en morcellement progressif pour limiter l’utilisation de la mémoire disponible.
Écriture#
La méthode writeFile permet d’écrire le contenu d’un buffer vers un fichier.
// Écrit un buffer vers un fichier.
req.fileio.writeFile(ByteBuffer(string: "Hello, world"), at: "/chemin/vers/le/fichier")
Le futur retourné indiquera la fin de l’écriture ou l’arrivée d’une erreur.
Middleware#
Pour plus d’informations relatives à l’exposition automatique des fichiers du dossier Public de votre projet, voir Middleware → FileMiddleware.
Avancé#
Pour les cas non supportés par les API de Vapor, vous pouvez utiliser le type NonBlockingFileIO de NIO directement.
// Processus principal, accès depuis l'objet Application.
let fileHandle = try await app.fileio.openFile(
path: "/chemin/vers/le/fichier",
eventLoop: app.eventLoopGroup.next()
).get()
print(fileHandle)
// Dans un contrôleur, accès depuis l'objet Request.
let fileHandle = try await req.application.fileio.openFile(
path: "/chemin/vers/le/fichier",
eventLoop: req.eventLoop)
print(fileHandle)
Pour plus d’informations, veuillez lire la documentation de l’API de SwiftNIO.