subir - que es jsf
Escriba el archivo en el disco usando JSF 2.2 inputFile (1)
Se supone que la anotación @javax.servlet.annotation.MultipartConfig
se coloca en la clase que implementa HttpServlet
, no en una clase de bean de respaldo. Básicamente, esa anotación debe colocarse en la clase FacesServlet
, que ya está hecha desde JSF 2.2.
En otras palabras, la anotación @MultipartConfig
en su clase de bean de respaldo se ignora y no tiene ningún efecto, y el archivo en realidad no se guarda en la location
que especificó en la anotación. En cambio, se ha guardado en una ruta relativa al llamado directorio de trabajo actual , que es básicamente la "carpeta actualmente abierta" en el momento en que se ejecuta java.exe
. En el caso de las aplicaciones web de Java que suele ser la carpeta binaria del servidor o más. Puede rastrearlo de la siguiente manera:
System.out.println(new File(".").getAbsolutePath());
Verás tu archivo cargado allí.
Además, incluso si la anotación @MultipartConfig
funcionó, el atributo de location
realmente no representa la ubicación de almacenamiento de carga permanente del archivo. En cambio, representa la ubicación de almacenamiento de disco temporal para el caso cuando el tamaño del archivo cargado excede el espacio de memoria disponible / configurado. Nunca debe almacenar archivos cargados permanentemente en la ubicación identificada por @MultipartConfig(location)
. Siempre debe obtener el contenido del archivo a través de la Part#getInputStream()
y escribirlo en la ubicación permanente deseada provista por un nuevo File
o Path
represente una ruta absoluta.
Deshazte de esa anotación completa de @MultipartConfig
. No está haciendo nada útil en una clase de bean de respaldo. Simplemente obtenga el contenido del archivo por la Part#getInputStream()
y cópielo en la ruta absoluta deseada:
try (InputStream input = imagemCarregada.getInputStream()) {
Files.copy(input, new File("/home/rogerio/tmp/teste.jpg").toPath());
}
Ver también
- Cómo guardar el archivo cargado en JSF
- Forma recomendada para guardar archivos cargados en una aplicación servlet .
Sin relación con el problema concreto, el uso de una sesión de frijol con este propósito no es ideal. Más bien use una vista o solicite una con alcance. Consulte también ¿Cómo elegir el alcance del frijol correcto? Y, el uso de prependId="false"
no se recomienda para otros fines que los formularios de inicio de sesión vinculados a un marco de inicio de sesión que no es compatible con la identificación JSF antepuesta en los nombres de los parámetros de solicitud. Ver también UIForm con prependId = "false" breaks <f: ajax render> .
Intento subir un archivo de imagen usando la etiqueta h: inputFile y escribirlo en el disco.
Mi código JSF:
<h:form id="fileUploadForm" enctype=''multipart/form-data'' prependId="false">
<h:inputFile value="#{solicitacaoManagedBean.imagemCarregada}" />
<br />
<h:commandButton styleClass="btn btn-primary " value="Enviar" action="#{solicitacaoManagedBean.enviarImagem}" />
</h:form>
Mi ManagedBean:
@Named(value = "solicitacaoManagedBean")
@SessionScoped
@MultipartConfig(location = "/home/rogerio/tmp/")
public class SolicitacaoManagedBean implements Serializable {
private Part imagemCarregada;
(...)
public void enviarImagem() throws IOException {
try {
imagemCarregada.write("teste.jpg");
} catch (IOException ioe) {
System.out.println("Erro ao escrever: " + ioe.getLocalizedMessage());
}
}
}
Supuestamente, el método escribe el elemento de carga en el disco y la IOException tampoco se lanza / atrapa.