tomcat - receive - spring thymeleaf file upload
Cómo establecer el tamaño máximo de archivo de carga (11)
Debe establecer los parámetros multipart.maxFileSize
y multipart.maxRequestSize
en valores superiores a los predeterminados. Esto se puede hacer en los archivos yml de configuración de inicio de primavera. Por ejemplo, agregar lo siguiente a application.yml
permitirá a los usuarios subir archivos de 10Mb:
multipart:
maxFileSize: 10Mb
maxRequestSize: 10Mb
Si el usuario necesita cargar varios archivos en una sola solicitud y pueden sumar más de 10Mb, deberá configurar multipart.maxRequestSize
a un valor mayor:
multipart:
maxFileSize: 10Mb
maxRequestSize: 100Mb
Estoy desarrollando aplicaciones basadas en Spring Boot y AngularJS usando JHipster. Mi pregunta es cómo establecer el tamaño máximo de carga de archivos ?
Si estoy intentando subir a un archivo grande, obtengo esta información en la consola:
DEBUG 11768 --- [io-8080-exec-10] c.a.app.aop.logging.LoggingAspect:
Enter: com.anuglarspring.app.web.rest.errors.ExceptionTranslator.processRuntimeException() with argument[s] =
[org.springframework.web.multipart.MultipartException: Could not parse multipart servlet request; nested exception is java.lang.IllegalStateException:
org.apache.tomcat.util.http.fileupload.FileUploadBase$FileSizeLimitExceededException: The field file exceeds its maximum permitted size of 1048576 bytes.]
Y la respuesta del servidor con el estado 500.
¿Cómo configurar eso?
En Spring Boot 2, spring.http.multipart
cambió a spring.servlet.multipart
Encontré la solución en Expert Exchange, que funcionó bien para mí.
@Bean
public MultipartConfigElement multipartConfigElement() {
MultipartConfigFactory factory = new MultipartConfigFactory();
factory.setMaxFileSize("124MB");
factory.setMaxRequestSize("124MB");
return factory.createMultipartConfig();
}
Estas propiedades en spring boot application.properties hacen que el tamaño de archivo aceptable sea ilimitado:
# To prevent maximum upload size limit exception
spring.servlet.multipart.max-file-size=-1
spring.servlet.multipart.max-request-size=-1
Hay algunas diferencias cuando definimos las propiedades en la aplicación.propiedades y la aplicación yaml.
En application.yml:
spring:
http:
multipart:
max-file-size: 256KB
max-request-size: 256KB
Y en application.propeties:
spring.http.multipart.max-file-size=128KB
spring.http.multipart.max-request-size=128KB
Nota: Spring versión 4.3 y Spring boot 1.4
Más específicamente, en su archivo de configuración application.yml
, agregue lo siguiente a la sección "spring:".
http:
multipart:
max-file-size: 512MB
max-request-size: 512MB
El espacio en blanco es importante y no puede usar pestañas para sangría .
Ninguna de las configuraciones anteriores funcionó para mí con una aplicación Spring.
La implementación de este código en la clase de aplicación principal (la anotada con @SpringBootApplication) hizo el truco.
@Bean
EmbeddedServletContainerCustomizer containerCustomizer() throws Exception {
return (ConfigurableEmbeddedServletContainer container) -> {
if (container instanceof TomcatEmbeddedServletContainerFactory) {
TomcatEmbeddedServletContainerFactory tomcat = (TomcatEmbeddedServletContainerFactory) container;
tomcat.addConnectorCustomizers(
(connector) -> {
connector.setMaxPostSize(10000000);//10MB
}
);
}
};
}
Puede cambiar el tamaño aceptado en la declaración:
connector.setMaxPostSize (10000000); // 10MB
Para Spring Boot 2. +, asegúrese de estar utilizando spring.servlet
lugar de spring.http
.
---
spring:
servlet:
multipart:
max-file-size: 10MB
max-request-size: 10MB
Si tiene que usar Tomcat, puede terminar creando EmbeddedServletContainerCustomizer , lo cual no es muy bueno.
Si puede vivir sin tomat, puede reemplazar tomcat con, por ejemplo, undertow y evitar este problema en absoluto.
Sé que esto es muy tarde para el juego, pero quería publicar el problema adicional que enfrenté al usar mysql, si alguien enfrenta el mismo problema en el futuro.
Como algunas de las respuestas mencionadas anteriormente, establecerlas en application.properties solucionará principalmente el problema
spring.http.multipart.max-file-size=16MB
spring.http.multipart.max-request-size=16MB
Lo estoy configurando en 16 MB, porque estoy usando el tipo de datos mysql MEDIUMBLOB para almacenar el archivo.
Pero después de corregir el archivo application.properties, al cargar un archivo> 4 MB dio el error: org.springframework.dao.TransientDataAccessResourceException: PreparedStatementCallback; SQL [insert into test_doc (doc_id, duration_of_doc, doc_version_id, file_name, doc) values (?,?,?,?,?)]; El paquete para consulta es demasiado grande (6656781> 4194304). Puede cambiar este valor en el servidor configurando la variable max_allowed_packet ''. la excepción anidada es com.mysql.jdbc.PacketTooBigException: el paquete para consulta es demasiado grande (6656781> 4194304). Puede cambiar este valor en el servidor configurando la variable max_allowed_packet ''.
Así que ejecuté este comando desde mysql:
SET GLOBAL max_allowed_packet = 1024*1024*16;
Si obtiene un error de "restablecimiento de la conexión", el problema podría estar en el conector predeterminado Tomcat atributo maxSwallowSize agregado de Tomcat 7.0.55 ( ChangeLog )
De Apache Tomcat 8 Referencia de configuración
maxSwallowSize : la cantidad máxima de bytes de cuerpo de solicitud (excluyendo la sobrecarga de codificación de transferencia) que Tomcat absorberá para una carga abortada. Una carga abortada es cuando Tomcat sabe que el cuerpo de la solicitud será ignorado pero el cliente aún lo envía. Si Tomcat no se traga el cuerpo, es poco probable que el cliente vea la respuesta. Si no se especifica, se usará el valor predeterminado 2097152 (2 megabytes). Un valor de menos de cero indica que no se debe aplicar ningún límite.
Para Springboot embebido, Tomcat declara un TomcatEmbeddedServletContainerFactory
Java 8:
@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.addConnectorCustomizers((TomcatConnectorCustomizer) connector -> {
if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
//-1 for unlimited
((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
}
});
return tomcat;
}
Java 7:
@Bean
public TomcatEmbeddedServletContainerFactory tomcatEmbedded() {
TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory();
tomcat.addConnectorCustomizers(new TomcatConnectorCustomizer() {
@Override
public void customize(Connector connector) {
if ((connector.getProtocolHandler() instanceof AbstractHttp11Protocol<?>)) {
//-1 for unlimited
((AbstractHttp11Protocol<?>) connector.getProtocolHandler()).setMaxSwallowSize(-1);
}
}
});
return tomcat;
}
O en Tomcat / conf / server.xml para 5MB
<Connector port="8080" protocol="HTTP/1.1"
connectionTimeout="20000"
redirectPort="8443"
maxSwallowSize="5242880" />
También en Spring boot 1.4, puede agregar las siguientes líneas a su application.properties para establecer el límite de tamaño de archivo:
spring.http.multipart.max-file-size=128KB
spring.http.multipart.max-request-size=128KB
Trabajó para mi. Fuente: https://spring.io/guides/gs/uploading-files/