Olá pessoal, estou querendo fazer 1 formulario onde tenha um file de imagem para dar upload para o banco, no caso enviaria o nome da imagem para o banco e a imagem para uma pasta, gostaria de saber formas de fazer isso por struts2/hibernate, se alguem tiver alguns exemplos ou me dizer como posso fazer isso ficarei muito agradecido
[Resolvido] Dúvida Upload Imagem
8 Respostas
Veja se te ajuda: http://www.guj.com.br/posts/list/194082.java
Olá, to tentando fazer upload de imagem seguindo esse tutorial porem tá dando uma exception:
java.lang.NullPointerException
java.io.FileInputStream.<init>(FileInputStream.java:103)
br.com.ibooker.action.AdicionaLivroAction.copyfile(AdicionaLivroAction.java:34)
br.com.ibooker.action.AdicionaLivroAction.execute(AdicionaLivroAction.java:27)
Segue as classes:
@Entity
public class Livros {
@Id
@GeneratedValue
private Long id ;
private String nome ;
private File upload ;
private String categoria ;
private String descricao ;
private Double preco ;
private int codigo ;
//getters and setters
}
public class AdicionaLivroAction {
private Livros livro ;
private File upload ;
private String nomeImagem ;
private String tipoImagem ;
@Action(value="adicionaLivro", results={
@Result(name="ok", location="/livro-adicionado.jsp")
})
public String execute() {
copyfile(upload, new File("/home/desk/Documentos/uploads\\" + nomeImagem)) ;
new LivrosDAO().adiciona(livro) ;
return "ok" ;
}
private static void copyfile(File in, File out) {
try {
FileChannel sourceChannel = new FileInputStream(in).getChannel() ;
FileChannel destinationChannel = new FileOutputStream(out).getChannel() ;
sourceChannel.transferTo(0, sourceChannel.size(), destinationChannel) ;
sourceChannel.close() ;
destinationChannel.close() ;
}
catch (IOException e) {
e.printStackTrace() ;
}
}
// getters and setters
}
<form action="adicionaLivro" method="post">
Nome: <input type="text" name="livro.nome"> <br>
Preço: <input type="text" name="livro.preco"> <br>
Imagem: <input type="file" name="livro.upload"> <br>
Categoria: <input type="text" name="livro.categoria"> <br>
Código: <input type="text" name="livro.codigo"> <br>
Descrição: <br>
<textarea rows="3" cols="50" name="livro.descricao"></textarea> <br>
<input type="submit" value="Adicionar">
</form>
Alguem sabe oque é?
Grato.
Coloca na declaração do seu form
enctype="multipart/form-data"
Coloca na declaração do seu formenctype="multipart/form-data"
Então brother, fiz oque vc falou, tipo… no meu formulario o nome do upload tá livro.upload onde na classe Livros tem File upload e os getters and setters. Assim eu queria colocar no banco, o nome dessa imagem, para depois puxar e jogar na tela, intende? porém tá dando a mesma exception. agora se eu tiro o nome de livro.upload e boto apenas upload ele faz o upload, mas no banco o nome fica como NULL … ou seja, não está indo para o banco pq não estou setando livro ali… e quando seto da a exception…
não sei oque é, porém na classe Livros no campo upload seria File mesmo? não seria Blob? não sei …
Grato.
Eu nunca usei um campo File na minha entidade para identificar a imagem/upload. Nunca tentei tbm.
Geralmente, em termos de modelagem (e como sugestão certo?), fica melhor vc colocar na entidade um boolean, dizendo se tem imagem ou não.
No seu form, vc passa qualquer nome para o file. Na action, vc recebe o file do request e copia ele para um diretorio da aplicação, com o nome sendo o ID do objeto (no seu caso, o livro).
OBS: Se for utilizar o ID como nome da imagem, teria que salvar o objeto no banco e só depois pegar o ID dele. Senão ele vai nulo.
Isso é uma sugestão, onde acho que poderia facilitar a modelagem e manutenção da sua aplicação.
Eu nunca usei um campo File na minha entidade para identificar a imagem/upload. Nunca tentei tbm.
Geralmente, em termos de modelagem (e como sugestão certo?), fica melhor vc colocar na entidade um boolean, dizendo se tem imagem ou não.
No seu form, vc passa qualquer nome para o file. Na action, vc recebe o file do request e copia ele para um diretorio da aplicação, com o nome sendo o ID do objeto (no seu caso, o livro).
OBS: Se for utilizar o ID como nome da imagem, teria que salvar o objeto no banco e só depois pegar o ID dele. Senão ele vai nulo.
Isso é uma sugestão, onde acho que poderia facilitar a modelagem e manutenção da sua aplicação.
Olá brother, não sei se intendi mto bem, vc diz que na classe Livros seria melhor deixar o upload como boolean né, e qdo der upload na imagem o nome ser o id do livro no caso, mas por exemplo, quando a pessoa preencher o formulario e adicionar o livro no bd. como ele ia iria colocar se tinha imagem ou não, e outra, quando fosse puxar uma lista das coisas do bd como iria dar display na imagem de cada livro? estou em dúvida quanto a isso. pq eu estava pensando em tipo: o rapaz preenchia o formulario e mandava adicionar, a imagem então era enviada para uma pasta e no banco onde tem imagem salvaria o nome e formato dela… no caso teste.jpg… dai ele puxaria a imagem e isso, não sei se é a melhor maneira…
oque vc acha?
No caso eu estou conseguindo fazer o upload da imagem para uma pasta mas não estou conseguindo salvar nada no espaço do banco… está ficando NULL …
O que eu quis dizer, é vc definir um padrão de arquitetura. Primeiro, nessa minha solução, vc passa a adotar que toda imagem vai ter o nome do ID do livro dela certo?
O cara preenche o form, com os dados do livro e faz o upload:
<input type="text" name="livro.nome" />
<input type="file" name="uploadImagem" />
// outros inputs e botao
Sua action vai receber esses parametros.
AdcionaLivroAction:
// salva o livro no banco
Livros livroSalvo = dao.adiciona(livro);
// aqui vai aquele seu codigo pra salvar o File uploadImagem (o nome que veio do form)
copyfile(upload, new File("/home/desk/Documentos/uploads\\" + livroSalvo.getId() + ".jpg")) ;
// aí, dentro do metodo copyFile, verifica se ele realmente copiou o arquivo com sucesso
// e marca o boolean como true no banco => livroSalvo.setImagem(true);
Esses passos iriam resolver seu problema de enviar o livro e salvar a imagem na pasta.
Agora, pq eu te disse que seria uma boa usar o ID do Livro? Justamente pra ficar fácil de buscar a imagem na pasta.
Pra mostrar as imagens dos livros na lista, pode fazer um metodo na classe Livros que devolve o endereco da imagem:
class Livro
public String getUrlImagem() {
return "/caminhoDo/DiretorioDeImagens/" + this.getId() + ".jpg";
}
Na pagina que mostra os livros, vc só declara o < img com o endereco desse metodo:
img src="livro.urlImagem"
OBS: Não sei se com Struts vai funcionar chamar o metodo do objeto na JSP, mas vc pode tentar. Eu utilizo VRaptor ao invés do Struts.
@leandronsp Intendi cara, melhor assim mesmo. Então eu fiz isso aqui deu tudo certinho, brigadão mesmo!