Almacénelo en cualquier lugar en una ubicación accesible, excepto la carpeta de proyectos del IDE, también conocida como la carpeta de implementación del servidor, por las razones mencionadas en la respuesta a la imagen cargada solo disponible después de actualizar la página :
Los cambios en la carpeta de proyectos del IDE no se reflejan inmediatamente en la carpeta de trabajo del servidor. Hay una especie de trabajo en segundo plano en el IDE que se encarga de que la carpeta de trabajo del servidor se sincronice con las últimas actualizaciones (esto está en términos del IDE llamado "publicación"). Esta es la causa principal del problema que estás viendo.
En el código del mundo real, hay circunstancias en las que el almacenamiento de archivos cargados en la carpeta de implementación de la aplicación web no funcionará en absoluto. Algunos servidores (ya sea de forma predeterminada o por configuración) no expanden el archivo WAR implementado en el sistema de archivos del disco local, sino que lo hacen completamente en la memoria. No puede crear archivos nuevos en la memoria sin editar básicamente el archivo WAR desplegado y volver a implementarlo.
Incluso cuando el servidor expande el archivo WAR desplegado en el sistema de archivos del disco local, todos los archivos recién creados se perderán en una nueva implementación o incluso en un simple reinicio, simplemente porque esos nuevos archivos no forman parte del archivo WAR original.
Realmente no importa a mí ni a nadie dónde exactamente en el sistema de archivos del disco local que se guardará, siempre y cuando no no siempre utiliza getRealPath()
el método . Usar ese método es en cualquier caso alarmante.
La ruta a la ubicación de almacenamiento puede definirse a su vez de muchas maneras. Tienes que hacerlo todo por ti mismo . Quizás es aquí donde se produce su confusión porque de alguna manera esperaba que el servidor lo hiciera todo de forma automática. Tenga en cuenta que @MultipartConfig(location)
no no especifica el destino final de subida, pero la ubicación de almacenamiento temporal para el tamaño de archivo del caso supera el umbral de almacenamiento de memoria.
Por lo tanto, la ruta a la ubicación de almacenamiento final se puede definir de cualquiera de las siguientes maneras:
Hardcoded:
File uploads = new File("/path/to/uploads");
Variable de entorno a través de SET UPLOAD_LOCATION=/path/to/uploads
:
File uploads = new File(System.getenv("UPLOAD_LOCATION"));
Argumento de VM durante el inicio del servidor a través de -Dupload.location="/path/to/uploads"
:
File uploads = new File(System.getProperty("upload.location"));
*.properties
entrada de archivo como upload.location=/path/to/uploads
:
File uploads = new File(properties.getProperty("upload.location"));
web.xml
<context-param>
con nombre upload.location
y valor /path/to/uploads
:
File uploads = new File(getServletContext().getInitParameter("upload.location"));
Si corresponde, use la ubicación proporcionada por el servidor, por ejemplo, en JBoss AS / WildFly :
File uploads = new File(System.getProperty("jboss.server.data.dir"), "uploads");
De cualquier manera, puede hacer referencia y guardar fácilmente el archivo de la siguiente manera:
File file = new File(uploads, "somefilename.ext");
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath());
}
O, cuando desee generar automáticamente un nombre de archivo único para evitar que los usuarios sobrescriban los archivos existentes con el mismo nombre:
File file = File.createTempFile("somefilename-", ".ext", uploads);
try (InputStream input = part.getInputStream()) {
Files.copy(input, file.toPath(), StandardCopyOption.REPLACE_EXISTING);
}
¿Cómo obtener part
en JSP / Servlet se responde en Cómo cargar archivos al servidor utilizando JSP / Servlet? y cómo obtener part
en JSF se responde en Cómo cargar un archivo usando JSF 2.2 <h: inputFile>? ¿Dónde está el archivo guardado?
Nota: no utilice, Part#write()
ya que interpreta la ruta relativa a la ubicación de almacenamiento temporal definida en @MultipartConfig(location)
.
Ver también: