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

179
Vistas
¿Cómo habilitar Spring Reactive Web MVC para manejar archivos de varias partes?

Estoy tratando de usar la nueva implementación reactiva web-mvc en una aplicación spring boot 2.0. Estoy tratando de definir un método que consuma un archivo de varias partes pero no logre que funcione :( - Siempre recibo un error 415.

Por un lado, tengo un controlador que contiene el siguiente mapeo de solicitudes:

 @RequestMapping(method = RequestMethod.POST, path = "/myPath/{param}/{param2}", consumes = MediaType.MULTIPART_FORM_DATA_VALUE) @ResponseBody public Mono<Void> postFile( @RequestBody MultipartFile data, @PathVariable("param") String param, @PathVariable("param2") String param2, @RequestHeader(name = HEADER_DATE, required = false) @DateTimeFormat(pattern = DATE_FORMAT) Instant instant ){ return fileService.handleData(Mono.just(data), param, param2, instant); }

Por otro lado, tuve que agregar un servidor en la parte superior de las dependencias básicas, ya que parece que Netty no maneja archivos de varias partes. Así que agregué la dependencia spring-boot-starter-tomcat que permitió que MultipartAutoConfiguration coincidiera y se cumpliera en la configuración automática de la aplicación.

Al publicar algo usando una llamada curl: curl 'Meta-Date: 20170101104532' --form "file=@file.bin" http://localhost:8082/myPath/foo/bar mientras los registros de depuración están activados ( logging.level.org.springframework.web=DEBUG ) Recibí esta excepción: org.springframework.web.server.UnsupportedMediaTypeStatusException: Request failure [status: 415, reason: "Content type 'multipart/form-data;boundary=------------------------58fa43b8f1a26de4' not supported"]

Este error lo RequestBodyArgumentResolver que tiene los siguientes tipos de medios admitidos: [*/*, text/xml, application/*+json;charset=UTF-8, application/xml, text/plain;charset=UTF-8, application/x-www-form-urlencoded, application/json;charset=UTF-8] proporcionado por 9 DecoderHttpMessageReader .

Antes de publicar también eché un vistazo a:

  • Spring MultiPart MediaType Unsupported que parece no ser relevante aquí ya que mi informe de autoconf contiene la siguiente entrada: MultipartAutoConfiguration#multipartResolver matched
  • establezca el tipo de contenido en utf-8 con angularjs $ http Agregar una configuración de encabezado Content-Transfer-Encoding: binary no cambió nada.

Según tengo entendido, Spring web 5.0 usa un nuevo sistema de decodificador de solicitudes, ya que no encuentro estas clases en una aplicación de arranque Spring 4, y todavía no hay ningún DecoderHttpMessageReader que se ocupe de un archivo de varias partes. ¿Me perdí algo? ¿O debo esperar a que se implemente uno?

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

0

De acuerdo, parece que esto simplemente no está implementado por ahora, ya que actualmente existe una solicitud de extracción para esta función: Agregar soporte de solicitud multiparte reactiva # 1201

Debería haber comprobado esto antes...

[EDITAR]: el problema se resolvió y se fusionó con la rama principal de Spring. Ya no debería ser un problema.

over 4 years ago · Santiago Trujillo Denunciar

0

@PutMapping(value="/{..}",consumes = MediaType.MULTIPART_FORM_DATA_VALUE) public Mono<Void> save(@RequestPart("file") FilePart multipartFormData,@RequestParam("fileName") String fileName,@PathVariable("..") String ..) throws IOException { List<ByteBuffer> bytesList = new LinkedList<>(); multipartFormData.content(). subscribe(item->bytesList.add(item.asByteBuffer())); int totalBytes = bytesList.stream().mapToInt(item->item.capacity()).sum(); ByteBuffer buffer = ByteBuffer.allocate(totalBytes); bytesList.stream().forEach(byteBuff->buffer.put(byteBuff)); baseImageHandler.saveImage(buffer, fileName, baseItemId); return Mono.empty(); }

Tenga en cuenta que es una versión de desarrollo, pero así es como me las arreglé para hacerlo.

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