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:
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.
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
nilesh kumar
También estaba enfrentando el mismo problema con Postman
para multipart
. Lo arreglé siguiendo los siguientes pasos:
- no seleccionar
Content-Type
en elHeaders
sección. - En
Body
ficha dePostman
debes seleccionarform-data
y seleccionefile 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 Text
luego 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
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
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);
}}
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 defile
. 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
@RestController
no 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