Configuración de Apache Tomcat Tamaño máximo de carga de archivos

Configuración de Apache Tomcat Tamaño máximo de carga de archivos

Estoy implementando una aplicación web Grails/Groovy, quiero limitar el tamaño de carga de archivos del usuario, no quiero que alguien cargue un archivo de 10 GB en mi servidor. Lo que descubrí fue que la mayoría de los enfoques para calcular el tamaño se realizan después de que el archivo ya está cargado, ¿qué pasa si alguien crea 10 perfiles y carga 10 archivos de hasta 10 GB? Eso puede agotar el servidor y ocupar mucho espacio en el disco del servidor. Entonces estoy tratando de evitar esto.

Descubrí que Apache Tomcat permite la siguiente configuración, en un enfoque codificado o de anotación. No estoy seguro de si el tamaño máximo de archivo se calcula durante el proceso de carga o después de cargar el archivo en un lugar temporal. La documentación indica lo siguiente:

La anotación @MultipartConfig admite los siguientes atributos opcionales:

Ubicación: una ruta absoluta a un directorio en el sistema de archivos. El atributo de ubicación no admite una ruta relativa al contexto de la aplicación. Esta ubicación se utiliza para almacenar archivos temporalmente mientras se procesan las piezas o cuando el tamaño del archivo excede la configuración fileSizeThreshold especificada. La ubicación predeterminada es "".

fileSizeThreshold: el tamaño del archivo en bytes después del cual el archivo se almacenará temporalmente en el disco. El tamaño predeterminado es 0 bytes.

MaxFileSize: el tamaño máximo permitido para los archivos cargados, en bytes. Si el tamaño de cualquier archivo cargado es mayor que este tamaño, el contenedor web generará una excepción (IllegalStateException). El tamaño predeterminado es ilimitado.

maxRequestSize: el tamaño máximo permitido para una solicitud de datos de formulario/multiparte, en bytes. El contenedor web generará una excepción si el tamaño total de todos los archivos cargados supera este umbral. El tamaño predeterminado es ilimitado.

enfoque de anotación:

@MultipartConfig(location="/tmp", fileSizeThreshold=1024*1024, 
    maxFileSize=1024*1024*5, maxRequestSize=1024*1024*5*5)

y aquí está el valor codificado:

<multipart-config>
<!– 50MB max –>
<max-file-size>52428800</max-file-size>
<max-request-size>52428800</max-request-size>
<file-size-threshold>0</file-size-threshold>
</multipart-config>

Agradecería que alguien pudiera aclarar si MaxFileSize se calcula durante el proceso de carga.

Respuesta1

MaxFileSize se calculará una vez que se haya cargado todo el archivo. Puede cargar un archivo (de 1 GB de tamaño) en su aplicación web y luego notará lo que realmente sucede. Por tanto, confiar en Tomcat no tendría sentido. Es posible hacer el mismo trabajo en Servlet, pero cuando su contador alcanza MaxFileSize, ¿cómo puede desconectar la conexión HTTP subyacente? Creo que no tienes manera. El protocolo HTTP es unidireccional, por lo que no puedes decirle al navegador que cancele la publicación larga a tiempo. Lo único que puede hacer es cuando su contador alcance el umbral, simplemente ignore los bytes de seguimiento del flujo de entrada para proteger el espacio en disco hasta que se complete la transmisión del archivo.

información relacionada