Olá pessoal,
Estou tendo dificuldade para implementar um sistema de upload para o meu sistema. Estou usando JSF, Facelets e o Apache MyFaces Trinidad para realizar o upload dos arquivos. Na minha tela de cadastro de usuário tenho uma tag <tr:inputFile id=“foto” value="#{usuariosC.arquivo}" /> do Trinidad. Tenho também uma classe UsuarioController que possui um atributo, chamado arquivo, do tipo UploadedFile.
O usuário preenche a tela de cadastro e ao salvar era para o upload da foto ser realizado. Entretanto, percebo que o atributo arquivo, configurado na tag <tr:inputFile id=“arquivo” value="#{usuariosC.arquivo}" /> está ficando com valor nulo, por isso não passa pela condição if(arquivo != null) do método uploadDaImagem da classe UsuarioController.
Pessoal, vocês poderiam me dizer porque é que o valor de arquivo está ficando nulo, mesmo eu carregando o caminho da imagem na tag tr:inputFile ???
A seguir os códigos implementados.
Formulário de cadastro do usuário.
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core"
xmlns:tr="http://myfaces.apache.org/trinidad">
<body>
<ui:composition template="./template_admin.xhtml">
<ui:define name="titulo">
Cadastro de usuários
</ui:define>
<ui:define name="conteudo">
<div id="formulario">
<fieldset>
<legend>Formulário de Cadastro de Usuários</legend>
<p>
<table border="0" cellpadding="0" cellspacing="0">
<tr>
<td>
<label>Matrícula:</label>
</td>
<td>
<input class="campo" requiredMessage="O campo Matrícula é obrigatório" required="true" jsfc="h:inputText" value="#{usuariosC.usuario.matricula}" id="matricula" name="matricula" type="text">
<f:convertNumber/>
</input>
<h:message for="matricula" errorStyle="color:red"/>
</td>
</tr>
<tr>
<td>
<label>Nome:</label>
</td>
<td>
<input class="campo" requiredMessage="O campo Nome é obrigatório" required="true" jsfc="h:inputText" value="#{usuariosC.usuario.nome}" id="nome" name="nome" type="text"/>
<h:message for="nome" errorStyle="color:red"/>
</td>
</tr>
<tr>
<td>
<label>Sobrenome:</label>
</td>
<td>
<input class="campo" requiredMessage="O campo Sobrenome é obrigatório" required="true" jsfc="h:inputText" value="#{usuariosC.usuario.sobrenome}" id="sobrenome" name="sobrenome" type="text"/>
<h:message for="sobrenome" errorStyle="color:red"/>
</td>
</tr>
<tr>
<td>
<label>Foto:</label>
</td>
<td>
<tr:inputFile id="foto" value="#{usuariosC.arquivo}"/>
<h:message for="foto"/>
</td>
</tr>
<tr>
<td>
<label>Telefone:</label>
</td>
<td>
<input class="campo" requiredMessage="O campo Telefone é obrigatório" required="true" jsfc="h:inputText" value="#{usuariosC.usuario.telefone}" id="telefone" name="telefone" type="text"/>
<h:message for="telefone" errorStyle="color:red"/>
</td>
</tr>
<tr>
<td>
<label>Celular:</label>
</td>
<td>
<input class="campo" requiredMessage="O campo Celular é obrigatório" required="true" jsfc="h:inputText" value="#{usuariosC.usuario.celular}" id="celular" name="celular" type="text"/>
<h:message for="celular" errorStyle="color:red"/>
</td>
</tr>
<tr>
<td>
<label>Email:</label>
</td>
<td>
<input class="campo" requiredMessage="O campo Email é obrigatório" required="true" jsfc="h:inputText" value="#{usuariosC.usuario.email}" id="email" name="email" type="text"/>
<h:message for="email" errorStyle="color:red"/>
</td>
</tr>
<tr>
<td>
<!-- aqui deve ficar vazio. -->
<br />
</td>
<td>
<input action="#{usuariosC.salvar}" jsfc="h:commandButton" value="Salvar" name="submit" type="submit" />
<input immediate="true" jsfc="h:commandButton" value="Cancelar" name="submit" type="reset" />
</td>
</tr>
</table>
</p>
</fieldset>
</div>
</ui:define>
</ui:composition>
</body>
</html>
Classe UsuarioController
/*
* To change this template, choose Tools | Templates
* and open the template in the editor.
*/
package biblioteca.gmf.web.controller;
import biblioteca.gmf.bd.bean.Pesquisa;
import biblioteca.gmf.bd.bean.Usuarios;
import biblioteca.gmf.bd.dao.imp.UsuariosDaoImp;
import biblioteca.gmf.web.utils.FacesUtils;
import java.io.File;
import java.io.FileNotFoundException;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.io.OutputStream;
import java.util.ArrayList;
import java.util.List;
import javax.faces.application.FacesMessage;
import javax.faces.context.FacesContext;
import javax.faces.model.DataModel;
import javax.faces.model.ListDataModel;
import javax.servlet.ServletContext;
import org.apache.myfaces.trinidad.model.UploadedFile;
/*import org.apache.commons.io.FilenameUtils;
import org.apache.commons.io.IOUtils;
import org.apache.myfaces.custom.fileupload.StorageStrategy;
import org.apache.myfaces.custom.fileupload.UploadedFile;*/
/**
*
* @author suporte
*/
public class UsuariosController {
private Usuarios usuario;
private Pesquisa pesquisa;
private DataModel model;
private UploadedFile arquivo;
public UploadedFile getArquivo() {
return arquivo;
}
public void setArquivo(UploadedFile arquivo) {
this.arquivo = arquivo;
}
public String novoUsuario()
{
this.usuario = new Usuarios();
return "novoUsuario";
}
public Usuarios getUsuario() {
return usuario;
}
public void setUsuario(Usuarios usuario) {
this.usuario = usuario;
}
public DataModel getTodas() throws Exception
{
UsuariosDaoImp dao = new UsuariosDaoImp();
model = new ListDataModel(dao.todosOsUsuarios());
return model;
}
/*public ArrayList getListaDeSelectItemDeUsuarios() throws Exception
{
UsuariosDAO dao = new UsuariosDAO();
return dao.ListaDeSelectedItemDeUsuarios();
}*/
public Usuarios getUsuarioFromEditOrDelete()
{
usuario = (Usuarios) model.getRowData();
return usuario;
}
public String editar()
{
usuario = getUsuarioFromEditOrDelete();
setUsuario(usuario);
return "editar";
}
public String excluir() throws Exception
{
UsuariosDaoImp dao = new UsuariosDaoImp();
usuario = getUsuarioFromEditOrDelete();
dao.excluir(usuario);
return "sucesso";
}
public String salvar() throws Exception
{
UsuariosDaoImp dao = new UsuariosDaoImp();
if(usuario.getId() == null)
{
uploadDaImagem();
dao.salvar(usuario);
}
else
{
dao.atualizar(usuario);
}
return "sucesso";
}
public String mostrarUsuarioPesquisado()
{
return "usuarioPesquisado";
}
public Pesquisa getPesquisa() {
return pesquisa;
}
public void setPesquisa(Pesquisa pesquisa) {
this.pesquisa = pesquisa;
}
public DataModel getUsuarioDaPesquisa() throws Exception
{
UsuariosDaoImp dao = new UsuariosDaoImp();
PesquisaDeLivroController p = new PesquisaDeLivroController();
List<Usuarios> list = new ArrayList<Usuarios>();
switch(pesquisa.getOpcao())
{
case 1:
{
list = dao.procurarUsuarioPorNome(pesquisa.getValorDaPesquisa());
break;
}
case 2:
{
list = dao.procurarUsuarioPorSobrenome(pesquisa.getValorDaPesquisa());
break;
}
}
model = new ListDataModel(list);
return model;
}
public String novaPesquisaDeUsuario()
{
this.pesquisa = new Pesquisa();
return "novaPesquisaDeUsuario";
}
public void uploadDaImagem()
{
try
{
FacesContext context = FacesContext.getCurrentInstance();
//pega informações do contexto para conseguir
//o caminho físico necessário para fazer o upload
//do arquivo.
ServletContext sc = (ServletContext) context.getExternalContext().getContext();
//verifica se há um arquivo para salvar
if(arquivo != null)
{
//tipo de arquivo
String tipoDeArquivo = arquivo.getContentType();
//verifica se é o tipo de arquivo permitido
if(tipoDeArquivo.equals("image/jpeg")
|| tipoDeArquivo.equals("image/pjpeg")
|| tipoDeArquivo.equals("image/gif"))
{
InputStream stream = arquivo.getInputStream();
int fSize = (int) arquivo.getLength();
byte[] buffer = new byte[(int) fSize];
String nomeArquivo = this.separaNomeImagem(arquivo.getFilename());
//chama o método que salva o arquivo
Boolean salvarImagem = this.salvarArquivoNoDisco(buffer,
stream,nomeArquivo,fSize,sc.getRealPath("/imagens"));
if(!salvarImagem)
{
FacesUtils.mensErro("Problema no carregamento do arquivo");
}
usuario.setFoto(nomeArquivo);
}
else
{
FacesUtils.mensErro("São somente aceitos os tipos de arquivo JPEG,PJPEG ou GIF");
}
}
}
catch(IOException e)
{
e.printStackTrace();
}
}
public boolean salvarArquivoNoDisco(byte[] buf,InputStream stream,
String nomeArquivo, int size, String path)
throws FileNotFoundException,IOException
{
nomeArquivo = this.separaNomeImagem(nomeArquivo);
File file = new File(path + "/" + nomeArquivo);
FileOutputStream output = new FileOutputStream(file);
try
{
while(true)
{
int count = stream.read(buf,0,size);
if(count == -1)
{
break;
}
output.write(buf,0,count);
}
}
catch(Exception ex)
{
ex.printStackTrace();
return false;
}
finally
{
output.flush();
output.close();
stream.close();
}
return true;
}
//separa o caminho físico do nome do arquivo
private String separaNomeImagem(String nomeImagem)
{
if(nomeImagem.lastIndexOf("\\") >= -1)
{
nomeImagem = nomeImagem.substring(nomeImagem.lastIndexOf("\\") + 1);
}
else if(nomeImagem.lastIndexOf("/") >= -1)
{
nomeImagem = nomeImagem.substring(nomeImagem.lastIndexOf("/") + 1);
}
return nomeImagem;
}
}