MultipartException: la solicitud actual no es una solicitud de varias partes

4 minutos de lectura

Avatar de usuario de Sal-laS
Sal-laS

Estoy tratando de hacer un controlador tranquilo para cargar archivos. He visto esto e hice este controlador:

@RestController
public class MaterialController {

    @RequestMapping(value="/upload", method= RequestMethod.POST)
    public String handleFileUpload(
            @RequestParam("file") MultipartFile file){
        String name = "test11";
        if (!file.isEmpty()) {
            try {
                byte[] bytes = file.getBytes();
                BufferedOutputStream stream =
                        new BufferedOutputStream(new FileOutputStream(new File(name + "-uploaded")));
                stream.write(bytes);
                stream.close();
                return "You successfully uploaded " + name + " into " + name + "-uploaded !";
            } catch (Exception e) {
                return "You failed to upload " + name + " => " + e.getMessage();
            }
        } else {
            return "You failed to upload " + name + " because the file was empty.";
        }
    }
}

y luego usé cartero para enviar un pdf:

ingrese la descripción de la imagen aquí

Pero el servidor falla con el error:

.MultipartException: Current request is not a multipart request

Nuevamente encontré esto y agregué un bean.xml archivo

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd">

    <bean id="multipartResolver"
          class="org.springframework.web.multipart.commons.CommonsMultipartResolver">
    </bean>
</beans>

Desafortunadamente, todavía se queja con el mismo error.

  • No sé si está causando su problema, pero la captura de pantalla muestra que no nombró el parte. De acuerdo a tu handleFileUpload() método, necesita dar el parte un nombre/valor clave de file. Sin un parte nombre, probablemente no envió nada al servidor, y “nada” = “no multiparte”.

    – Andreas

    2 de febrero de 2017 a las 22:23


  • No, no debería necesitar crear un directorio.

    – Andreas

    2 de febrero de 2017 a las 22:27

  • No relacionado: Desde que anotó la clase con @RestControllerno es necesario anotar el método con @ResponseBody. Ver javadoc: docs.spring.io/spring/docs/current/javadoc-api/org/…

    – Andreas

    2 de febrero de 2017 a las 22:29

Cuando utilice Postman para una solicitud de varias partes, no especifique un tipo de contenido personalizado en el encabezado. Entonces, su pestaña Encabezado en Postman debería estar vacía. El cartero determinará el límite de datos del formulario. En la pestaña Cuerpo de Postman, debe seleccionar los datos del formulario y seleccionar el tipo de archivo. Puede encontrar una discusión relacionada en https://github.com/postmanlabs/postman-app-support/issues/576

  • no te entendí ¿Puedes enviar una imagen de la solicitud correcta en el cartero?

    – Sal-las

    3 de febrero de 2017 a las 12:09

  • Verifique la pestaña Encabezados justo antes de la pestaña Cuerpo en Postman. Su solicitud es correcta, pero hay alguna entrada en Encabezados, ya que la imagen compartida por usted muestra Encabezados (1). Eliminar la entrada desde allí.

    – abaghel

    3 de febrero de 2017 a las 12:12

Parece que el problema es que la solicitud al servidor no es una solicitud de varias partes. Básicamente, necesita modificar su formulario del lado del cliente. Por ejemplo:

<form action="..." method="post" enctype="multipart/form-data">
  <input type="file" name="file" />
</form>

Espero que esto ayude.

  • es una aplicación de descanso, actualmente, no hay html para el lado del cliente. yo uso cartero

    – Sal-las

    2 de febrero de 2017 a las 22:11

  • @SalmanLashkarara, aún puede agregarlo en los encabezados de su cliente de descanso.

    – Sandeep Kumar

    15 de diciembre de 2019 a las 9:10

Avatar de usuario de Nilesh Kumar
nilesh kumar

También estaba enfrentando el mismo problema con Postman para multipart. Lo arreglé siguiendo los siguientes pasos:

  • no seleccionar Content-Type en el Headers sección.
  • En Body ficha de Postman debes seleccionar form-data y seleccione file type.

Funcionó para mí.

Eso me pasó una vez: tenía una configuración de Postman que funcionaba perfectamente, pero luego, sin cambiar nada, aunque no informé al Content-Type manualmente en Postman, dejó de funcionar; siguiendo las respuestas a esta pregunta, intenté deshabilitar el encabezado y dejar que Postman lo agregue automáticamente, pero ninguna de las dos opciones funcionó.

Terminé resolviéndolo yendo a la Body pestaña, cambie el tipo de parámetro de File a Textluego de vuelta a File y luego volviendo a seleccionar el archivo a enviar; de alguna manera, esto hizo que funcionara de nuevo. Huele como un error de Postman, en ese caso específico, ¿tal vez?

En application.properties, agregue esto:

spring.servlet.multipart.max-file-size=128KB
spring.servlet.multipart.max-request-size=128KB
spring.http.multipart.enabled=false

y en su formulario html, necesita un: enctype="multipart/form-data". Por ejemplo:

<form method="POST" enctype="multipart/form-data" action="https://stackoverflow.com/">

¡Espero que esto ayude!

  • ‘spring.http.multipart.enabled’ está en desuso. Utilice ‘spring.servlet.multipart.enabled’.

    – horvoje

    22 de febrero de 2022 a las 10:22

  • ¿Está seguro de que desea establecer el indicador ‘habilitado’ en ‘falso’?

    – horvoje

    22 de febrero de 2022 a las 10:23

Avatar de usuario de KayV
kayv

Compruebe el archivo que ha seleccionado en la solicitud.

Para mí, recibí el error porque el archivo no estaba presente en el sistema, ya que importé la solicitud de otra máquina.

  • ‘spring.http.multipart.enabled’ está en desuso. Utilice ‘spring.servlet.multipart.enabled’.

    – horvoje

    22 de febrero de 2022 a las 10:22

  • ¿Está seguro de que desea establecer el indicador ‘habilitado’ en ‘falso’?

    – horvoje

    22 de febrero de 2022 a las 10:23

avatar de usuario de mzhehalo
mzhehalo

En mi caso, yo remoto:

‘Tipo de contenido’: ‘aplicación/json’,

de mi Interceptadory todo funciona.

     intercept(httpRequest: HttpRequest<any>, httpHandler: HttpHandler): Observable<HttpEvent<any>> {
if (this.authService.isUserLoggedIn() && httpRequest.url.indexOf('login') === -1) {
  const authReq = httpRequest.clone({
    headers: new HttpHeaders({
    'Content-Type': 'application/json',
      Authorization: this.authService.getBasicAuth()
    })
  });
  return httpHandler.handle(authReq);
} else {
  return httpHandler.handle(httpRequest);
}}

¿Ha sido útil esta solución?