¿Cómo cargar un archivo usando JSF 2.2<h: inputFile>? ¿Dónde está el archivo guardado?
file-upload jsf-2.2 (1)
Me gustaría poder cargar archivos en mi aplicación web JSF2.2, así que comencé a usar el nuevo componente
<h:inputFile>
.
Mi única pregunta es, ¿cómo puedo especificar la ubicación, donde se guardarán los archivos en el servidor?
Me gustaría obtenerlos como instancias de
java.io.File
.
Esto tiene que implementarse en el bean de respaldo, pero no entiendo claramente cómo.
JSF no guardará el archivo en ninguna ubicación predefinida.
Básicamente, solo le ofrecerá el archivo cargado como una instancia de
javax.servlet.http.Part
que se encuentra detrás de escena temporalmente almacenada en la memoria del servidor y / o en la ubicación de almacenamiento temporal en el disco que no debería preocuparle.
Para guardarlo en la ubicación deseada, debe obtener el contenido por
Part#getInputStream()
y luego
copy
en la
Path
representa la ubicación.
Puede hacer esto en un método de acción (ajax) (escucha) de la manera habitual.
Aquí hay un ejemplo que lo hace con un oyente ajax durante el evento de
change
HTML DOM:
<h:form enctype="multipart/form-data">
<h:inputFile value="#{bean.file}">
<f:ajax listener="#{bean.save}" />
</h:inputFile>
</h:form>
private Part file; // +getter+setter
public void save() {
try (InputStream input = file.getInputStream()) {
Files.copy(input, new File(uploads, filename).toPath());
}
catch (IOException e) {
// Show faces message?
}
}
La carpeta de
uploads
y el
filename
del
filename
están completamente bajo su control.
Por ejemplo,
"/path/to/uploads"
Part#getSubmittedFileName()
"/path/to/uploads"
y
Part#getSubmittedFileName()
respectivamente.
Tenga en cuenta que cualquier archivo existente se sobrescribirá, es posible que desee usar el
File#createTempFile()
para
File#createTempFile()
un nombre de archivo.
No use la
Part#write()
como puede sugerir algún prople.
Básicamente, cambiará el nombre del archivo en la ubicación de almacenamiento temporal como lo identifica
@MultipartConfig(location)
.
Tampoco use
ExternalContext#getRealPath()
para guardar el archivo cargado en la carpeta de implementación.
El archivo se perderá cuando el WAR se vuelva a implementar por la sencilla razón de que el archivo no está contenido en el WAR original.
Guárdelo siempre en una ruta absoluta fuera de la carpeta de implementación.
Para una demostración en vivo, verifique el último elemento de la
demostración
<o:graphicImage>
en el escaparate de OmniFaces
.