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.

Editar esta página