Empresas
Empleos
  • Sobre nosotros
  • Soluciones
    • Publicación de vacantes
      Publica tu vacante y recibe candidatos calificados en 48h.
    • Evaluación de candidatos
      500+ pruebas técnicas y psicológicas, más anti-fraude.
    • Headhunting
      Búsqueda ejecutiva a la medida de principio a fin.
    • Nómina + EOR
      Dispersión de nómina y EOR en más de 15 países de LATAM.
  • Precios
  • Empleos

0

324
Vistas
Vapor sube varios archivos a la vez

Quiero cargar varias imágenes en una solicitud POST. Actualmente, la parte de mi solicitud relacionada con la carga de archivos está tomando un archivo y se ve así:

 return try req.content.decode(File.self).flatMap(to: Image.self) { (file) in try file.data.write(to: URL(fileURLWithPath: DirectoryConfig.detect().workDir + localImageStorage + file.filename)) return try Image(userID: user.requireID(), url: imageStorage + file.filename, filename: file.filename).save(on: req) }

Esto funciona bien. Ahora, traté de cambiar .decode(File.self) a .decode([File].self) y hacer un bucle para todos los archivos.
Cuando intento cargar imágenes usando el parámetro data[] en Postman, aparece el siguiente error:

No se admite la decodificación de datos de formulario anidados.

¿Cómo puedo solucionar esto?

over 4 years ago · Santiago Trujillo
1 Respuestas
Responde la pregunta

0

El siguiente ejemplo funciona bien, probado varias veces ya 🙂

 struct MyPayload: Content { var somefiles: [File] } func myUpload(_ req: Request) -> Future<HTTPStatus> { let user: User = try req.requireAuthenticated() return try req.content.decode(MyPayload.self).flatMap { payload in let workDir = DirectoryConfig.detect().workDir return payload.somefiles.map { file in let url = URL(fileURLWithPath: workDir + localImageStorage + file.filename) try file.data.write(to: url) return try Image(userID: user.requireID(), url: imageStorage + file.filename, filename: file.filename).save(on: req).transform(to: ()) }.flatten(on: req).transform(to: .ok) } }

por cierto, también podría declarar su carga útil exactamente en los parámetros de la función

 func myUpload(_ req: Request, _ payload: MyPayload) -> Future<HTTPStatus> { let user: User = try req.requireAuthenticated() let workDir = DirectoryConfig.detect().workDir return payload.somefiles.map { file in let url = URL(fileURLWithPath: workDir + localImageStorage + file.filename) try file.data.write(to: url) return try Image(userID: user.requireID(), url: imageStorage + file.filename, filename: file.filename).save(on: req).transform(to: ()) }.flatten(on: req).transform(to: .ok) }

la única diferencia está en declarar la función de punto final en el enrutador

 router.post("upload", use: myUpload)

contra

 router.post(MyPayload.self, at: "upload", use: myUpload)

Luego en Postman sube tus archivos así CarteroMúltiplesArchivos

over 4 years ago · Santiago Trujillo Denunciar
Responde la pregunta
Encuentra empleos remotos

¡Descubre la nueva forma de encontrar empleo!

Top de empleos
Top categorías de empleo
Empresas
Publicar vacante Precios Comercial
Legal
Términos y condiciones Política de privacidad
© 2026 PeakU Inc. All Rights Reserved.
Andres GPT
Recomiéndame algunas ofertas
Necesito ayuda