Leí aquí que no se debe guardar el archivo en el servidor de todos modos, ya que no es portátil, transaccional y requiere parámetros externos. Sin embargo, dado que necesito una solución tmp para tomcat (7) y que tengo control (relativo) sobre la máquina del servidor que quiero saber:
¿Cuál es el mejor lugar para guardar el archivo? ¿Debo guardarlo en
/WEB-INF/uploads
(desaconsejado aquí ) o en algún lugar debajo$CATALINA_BASE
(ver aquí ) o ...? El tutorial de JavaEE 6 obtiene la ruta del usuario (: wtf :). NB: el archivo no debe ser descargable de ninguna manera.¿Debo configurar un parámetro de configuración como se detalla aquí ? Apreciaría algo de código (prefiero darle una ruta relativa, por lo que es al menos portátil Tomcat),
Part.write()
parece prometedor, pero aparentemente necesita una ruta absolutaMe interesaría una exposición de las desventajas de este enfoque frente a una base de datos / repositorio JCR
Por desgracia, la FileServlet por @BalusC se concentra en la descarga de archivos, mientras que su respuesta en la carga de archivos se salta la parte de dónde guardar el archivo.
Sería preferible una solución fácilmente convertible para usar una implementación DB o JCR (como jackrabbit ).
fuente
Respuestas:
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 :
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:
Variable de entorno a través de
SET UPLOAD_LOCATION=/path/to/uploads
:Argumento de VM durante el inicio del servidor a través de
-Dupload.location="/path/to/uploads"
:*.properties
entrada de archivo comoupload.location=/path/to/uploads
:web.xml
<context-param>
con nombreupload.location
y valor/path/to/uploads
:Si corresponde, use la ubicación proporcionada por el servidor, por ejemplo, en JBoss AS / WildFly :
De cualquier manera, puede hacer referencia y guardar fácilmente el archivo de la siguiente manera:
O, cuando desee generar automáticamente un nombre de archivo único para evitar que los usuarios sobrescriban los archivos existentes con el mismo nombre:
¿Cómo obtener
part
en JSP / Servlet se responde en Cómo cargar archivos al servidor utilizando JSP / Servlet? y cómo obtenerpart
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:
fuente
@MultipartConfig(location)
Especifica el temporal ubicación storgé el que el servidor debe utilizar cuando el tamaño del archivo supera el umbral de almacenamiento de memoria, no la ubicación de almacenamiento permanente en los que desea en última instancia, al igual que para ser almacenados. Este valor predeterminado es la ruta identificada por lajava.io.tmpdir
propiedad del sistema. Vea también esta respuesta relacionada a un intento fallido de JSF: stackoverflow.com/questions/18478154/…Part.write
>> Esto permite que una implementación particular use, por ejemplo, el cambio de nombre de archivos, cuando sea posible, en lugar de copiar todos los datos subyacentes, obteniendo así un beneficio de rendimiento significativo junto con algunos método de decir que algunos Apache lib desconocido "corte" (vs copia) me ahorraría la molestia de escribir los bytes a mí mismo - y volver a crear un archivo que ya existe (ver también aquí )Part#write()
. Actualicé la respuesta con ella."jboss.server.data.dir"
?Publico mi forma final de hacerlo en función de la respuesta aceptada:
dónde :
y las /WEB-INF/app.properties:
HTH y si encuentras un error avísame
fuente