Ficheros¶
Vapor ofrece una API sencilla para leer y escribir archivos de forma asíncrona dentro de los controladores de rutas. Esta API se construye sobre el tipo NonBlockingFileIO
de NIO.
Lectura¶
El método principal para leer un archivo entrega fragmentos al controlador de devolución de llamadas a medida que se leen del disco. El archivo a leer se especifica mediante su ruta. Las rutas relativas buscarán en el directorio de trabajo actual del proceso.
// Lee un archivo del disco de forma asíncrona.
let readComplete: EventLoopFuture<Void> = req.fileio.readFile(at: "/path/to/file") { chunk in
print(chunk) // ByteBuffer
}
// O
try await req.fileio.readFile(at: "/path/to/file") { chunk in
print(chunk) // ByteBuffer
}
// La lectura ha finalizado
Si se utiliza EventLoopFuture
, el futuro devuelto indicará cuándo ha completado la lectura o si ha ocurrido un error. Si se utiliza async
/await
, cuando regresa del await
, la lectura se ha completado. En caso de error, se lanzará una excepción.
Flujo¶
El método streamFile
convierte un archivo de transmisión en una respuesta Response
. Este método establecerá automáticamente los encabezados apropiados, como ETag
y Content-Type
.
// Transmite el archivo como una respuesta HTTP de forma asíncrona.
req.fileio.streamFile(at: "/path/to/file").map { res in
print(res) // Response
}
// O
let res = req.fileio.streamFile(at: "/path/to/file")
print(res)
El resultado puede ser devuelto directamente por su controlador de ruta.
Recolector¶
El método collectFile
lee el archivo especificado en un buffer.
// Lee el archivo en un buffer.
req.fileio.collectFile(at: "/path/to/file").map { buffer in
print(buffer) // ByteBuffer
}
// o
let buffer = req.fileio.collectFile(at: "/path/to/file")
print(buffer)
Advertencia
Este método requiere que el archivo entero esté en la memoria desde el inicio. Utilice una lectura por fragmentos (chunked) o flujo contínuo (streaming) para limitar el uso de memoria.
Escritura¶
El método writeFile
permite escribir un buffer a un archivo.
// Escribe un buffer a un archivo.
req.fileio.writeFile(ByteBuffer(string: "Hello, world"), at: "/path/to/file")
El futuro devuelto indicará cuándo se ha completado la escritura o si se ha producido un error.
Middleware¶
Para más información acerca de cómo enviar archivos automáticamente desde la carpeta Public de su projecto, visite Middleware → FileMiddleware.
Avanzado¶
En casos donde la API de vapor no de asistencia, puede utilizar directamente el tipo NonBlockingFileIO
de NIO.
// Hilo principal
let fileHandle = try await app.fileio.openFile(
path: "/path/to/file",
eventLoop: app.eventLoopGroup.next()
).get()
print(fileHandle)
// En un controlador de ruta.
let fileHandle = try await req.application.fileio.openFile(
path: "/path/to/file",
eventLoop: req.eventLoop)
print(fileHandle)
Para más información, visite la API reference de SwiftNIO.