jsf file-upload jsf-2.2 multipartform-data

¿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 .

Ver también: