Bom dia,
Estou utilizando o graphicImage do primeFaces.
Quando entro na pagina a imagem padrão aprece numa boa, porém quando aperto F5 a imagem desaparece.
Procurei no Mr. Google, e não encontrei nenhuma solução para isso.
Se alguém puder ajudar, eu agradeço.
O código da parte da página é o seguinte:
<h:panelGrid columns="2" cellpadding="2" >
<p:graphicImage id="gpiFoto" value="#{cadastroDePessoaBean.stcImagem}" width="125" height="150" cache="false" styleClass="Foto_Padrao" />
<h:panelGrid columns="1" cellpadding="1">
<p:fileUpload id="fluFotos" auto="true" image="//resources//images//upload.gif"
width="16" height="16" allowTypes="*.gif; *.png; *.jpg" description="imagem"
fileUploadListener="#{cadastroDePessoaBean.fileUploadAction}" update="gpiFoto"
customUI="false" wmode="false" widgetVar="uploader" sizeLimit="204800" />
<h:commandLink id="cmdLimparFoto" actionListener="#{cadastroDePessoaBean.limparFoto}" >
<h:graphicImage id="gpiLimparFoto" value="//resources//images//limpar.gif" width="10" height="10" />
<f:ajax render="gpiFoto" />
</h:commandLink>
</h:panelGrid>
</h:panelGrid>
e o código do Bean é esse:
@ManagedBean
@SessionScoped
public class CadastroDePessoaBean {
@EJB
private ImagemDao imagemDao;
private Imagem imagem;
private StreamedContent stcImagem;
public StreamedContent getStcImagem() {
return stcImagem;
}
public void setStcImagem(StreamedContent stcImagem) {
this.stcImagem = stcImagem;
}
public Imagem getImagem() {
return imagem;
}
public void setImagem(Imagem imagem) {
this.imagem = imagem;
}
public void fileUploadAction(FileUploadEvent event) {
try {
stcImagem = new DefaultStreamedContent(event.getFile().getInputstream());
imagem = new Imagem(event.getFile().getContents());
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
public void limparFoto(ActionEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
InputStream io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
stcImagem = new DefaultStreamedContent(io);
imagem = null;
}
}
Quando dou refresh na página, nenhum método ou função do Bean é executado.
debuga o código e verifica qual o caminho ele chama no refresh. Verifique também no firebug aonde está a referência. Posta o que aparece pra gente.
Quando inicio pela primeira vez ele executa a seguinte sequencia de código:
public CadastroDePessoaBean() {
init();
}
private void init() {
limparFoto(null);
strAtual = "newpessoa";
pessoaFisica = new PessoaFisica();
email = new Email();
endereco = new Endereco();
logradouro = new Logradouro();
imagens = new ArrayList<Imagem>();
enderecos = new ArrayList<Endereco>();
sexos = Sexo.list();
}
public void limparFoto(ActionEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
InputStream io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
stcImagem = new DefaultStreamedContent(io, "image/png", "Foto");
imagem = null;
}
public StreamedContent getStcImagem() {
return stcImagem;
}
quando pressiono F5 ele executa apenas o getStcImagem() que apresenta em seu conteúdo o mesmo que já existia quando setei ao iniciar (a imagem padrão).
public StreamedContent getStcImagem() {
return stcImagem;
}
conforme disse no topo do tótipo, o código do graphicImage é o seguinte:
<p:graphicImage id="gpiFoto" value="#{cadastroDePessoaBean.stcImagem}" width="125" height="150" cache="false" styleClass="Foto_Padrao" />
O que deve ser. Já testei no IE e no Chrome, acontece a mesma coisa, a imagem na página desaparece ao pressionar F5.
qual o escopo que está o seu mb?
Está com o escopo SessionScoped
@ManagedBean
@SessionScoped
public class CadastroDePessoaBean {
No seu ManagedBean altere-o como descrito abaixo.
@ManagedBean
@SessionScoped
public class CadastroDePessoaBean {
@EJB
private ImagemDao imagemDao;
private Imagem imagem;
private StreamedContent stcImagem;
private FileUploadEvent fue;
public StreamedContent getStcImagem() {
return stcImagem = new DefaultStreamedContent(fue.getFile().getInputstream(),fue.getFile().getContentType(),fue.getFile().getFileName());
}
public void setStcImagem(StreamedContent stcImagem) {
this.stcImagem = stcImagem;
}
public Imagem getImagem() {
return imagem;
}
public void setImagem(Imagem imagem) {
this.imagem = imagem;
}
public void fileUploadAction(FileUploadEvent event) {
try {
//stcImagem = new DefaultStreamedContent(event.getFile().getInputstream());
this.fue = event;
imagem = new Imagem(event.getFile().getContents());
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
public void limparFoto(ActionEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
InputStream io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
stcImagem = new DefaultStreamedContent(io);
imagem = null;
}
}
Vilsonei, obrigado.
Fiz o que você descreveu e funcionou legal.
Se não for pedir muito, como faço para que a imagem default, que aparece ao clicar no botão limpar, que executa o método limparFoto(), permaneça após o pressionamento da tecla F5 (refresh).
public void limparFoto(ActionEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
final InputStream io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
stcImagem = new DefaultStreamedContent(io, "image/png", "Foto");
imagem = null;
}
É só alterar a sua classe conforme abaixo.
@ManagedBean
@SessionScoped
public class CadastroDePessoaBean {
@EJB
private ImagemDao imagemDao;
private Imagem imagem;
private StreamedContent stcImagem;
private FileUploadEvent fue;
private InputStream io;
public StreamedContent getStcImagem() {
if (imagem != null)
return stcImagem = new DefaultStreamedContent(fue.getFile().getInputstream(),fue.getFile().getContentType(),fue.getFile().getFileName());
else
return stcImagem = new DefaultStreamedContent(io);
}
public void setStcImagem(StreamedContent stcImagem) {
this.stcImagem = stcImagem;
}
public Imagem getImagem() {
return imagem;
}
public void setImagem(Imagem imagem) {
this.imagem = imagem;
}
public void fileUploadAction(FileUploadEvent event) {
try {
//stcImagem = new DefaultStreamedContent(event.getFile().getInputstream());
this.fue = event;
imagem = new Imagem(event.getFile().getContents());
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
public void limparFoto(ActionEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
//InputStream io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
//stcImagem = new DefaultStreamedContent(io);
imagem = null;
}
}
Boa noite vilsonei, obrigado mais uma fez.
Não deu certo com o io sendo passado como parametro no getStrImagem.
public StreamedContent getStcImagem() {
try {
if (imagem != null) {
stcImagem = new DefaultStreamedContent(fue.getFile().getInputstream(), fue.getFile().getContentType(), fue.getFile().getFileName());
}else{
stcImagem = new DefaultStreamedContent(io);
}
} catch (IOException ex) {
Logger.getLogger(CadastroDePessoaBean.class.getName()).log(Level.SEVERE, null, ex);
}
return stcImagem;
}
continua dando o mesmo problema para a imagem default. Em questão a imagem escolhida pelo fileupload continua tudo legal.
mas quando coloco a imagem padrão e aperto F5 a imagem some.
jrfercar, tente desta forma, eu não testei este código, mas acredito que irá dar certo, pois o componente p:graphicImage precisa ser alimentado diretamente da fonte de dados.
@ManagedBean
@SessionScoped
public class CadastroDePessoaBean {
@EJB
private ImagemDao imagemDao;
private Imagem imagem;
private StreamedContent stcImagem;
private FileUploadEvent fue;
// private InputStream io;
public StreamedContent getStcImagem() {
if (imagem != null)
return stcImagem = new DefaultStreamedContent(fue.getFile().getInputstream(),fue.getFile().getContentType(),fue.getFile().getFileName());
else
//return stcImagem = new DefaultStreamedContent(io);
return stcImagem = new DefaultStreamedContent(context.getExternalContext().getResourceAsStream("//resources//images//profile.gif"));
}
public void setStcImagem(StreamedContent stcImagem) {
this.stcImagem = stcImagem;
}
public Imagem getImagem() {
return imagem;
}
public void setImagem(Imagem imagem) {
this.imagem = imagem;
}
public void fileUploadAction(FileUploadEvent event) {
try {
//stcImagem = new DefaultStreamedContent(event.getFile().getInputstream());
this.fue = event;
imagem = new Imagem(event.getFile().getContents());
} catch (IOException ex) {
System.out.println(ex.getMessage());
}
}
public void limparFoto(ActionEvent event) {
FacesContext context = FacesContext.getCurrentInstance();
//InputStream io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
//io = context.getExternalContext().getResourceAsStream("//resources//images//profile.gif");
//stcImagem = new DefaultStreamedContent(io);
imagem = null;
}
}
Mais uma vez muito obrigado vilsonei,
Realmente, para se trabalhar com o graphicImage é necessário alimentar a imagem diretamente.
Fiz como você disse e deu certo.
public StreamedContent getStcImagem() {
try {
if (imagem != null) {
stcImagem = new DefaultStreamedContent(fue.getFile().getInputstream(), fue.getFile().getContentType(), fue.getFile().getFileName());
}else{
stcImagem = new DefaultStreamedContent(FacesContext.getCurrentInstance().getExternalContext().getResourceAsStream("//resources//images//profile.gif"));
}
} catch (IOException ex) {
Logger.getLogger(CadastroDePessoaBean.class.getName()).log(Level.SEVERE, null, ex);
}
return stcImagem;
}
valeu mesmo.
Beleza cara, qualquer coisa estamos aí!