![]() |
![]() |
![]() |
|
![]() |
![]() ![]() ![]() ![]() ![]() ![]() ![]() |
www.linkcom.com.br | ![]() |
Adicionando suporte a upload de arquivos no NEO
O neo oferece várias facilidade, dentre elas, o upload simplificado de arquivos.
Preparando a aplicação para suportar upload de arquivos(Observação: A forma como o NEO faz upload de arquivos será reestruturada em uma versão futura, quebras de compatibilidade poderão ocorrer. Caso isso ocorra será informado.) No primeiro passo, vamos criar a tabela arquivo de sua aplicação, que é responsável por linkar o arquivo ao diretório físico, além também de facilitar a manipulação do mesmo. CREATE TABLE "public"."arquivo" ( "cdarquivo" INTEGER NOT NULL, "cdusuario" INTEGER, "dtatualizacao" TIMESTAMP WITHOUT TIME ZONE, "nome" VARCHAR(100), "tipoconteudo" VARCHAR(50), "tamanho" INTEGER, "tsmodificacao" TIMESTAMP WITHOUT TIME ZONE, CONSTRAINT "pk_arquivo" PRIMARY KEY("cdarquivo") ) WITHOUT OIDS; No seu web.xml coloque, Caso não tenha: <servlet> <servlet-name>download</servlet-name> <servlet-class>br.com.linkcom.neo.view.DownloadFileServlet</servlet-class> </servlet> <servlet-mapping> <servlet-name>download</servlet-name> <url-pattern>/DOWNLOADFILE/*</url-pattern> </servlet-mapping> 1.1 arquivo.javaCrie um classe e coloque no seu pacote de beans, e de o Nome de Arquivo.java@Entity @SequenceGenerator(name = "sq_arquivo", sequenceName = "sq_arquivo") public class Arquivo implements File { protected Long cdarquivo; protected String nome; protected String tipoconteudo; protected Long tamanho; protected byte[] conteudo; protected Timestamp tsmodificacao; public Arquivo() { } public Arquivo(Long cdarquivo) { this.cdarquivo = cdarquivo; } @Id @GeneratedValue(strategy=GenerationType.AUTO, generator="sq_arquivo") public Long getCdarquivo() { return cdarquivo; } @MaxLength(50) public String getTipoconteudo() { return tipoconteudo; } @Transient public byte[] getConteudo() { return conteudo; } @MaxLength(100) @DescriptionProperty public String getNome() { return nome; } @Required public Long getTamanho() { return tamanho; } public Timestamp getTsmodificacao() { return tsmodificacao; } public void setCdarquivo(Long cdarquivo) { this.cdarquivo = cdarquivo; } public void setTipoconteudo(String tipoconteudo) { this.tipoconteudo = tipoconteudo; } public void setConteudo(byte[] conteudo) { this.conteudo = conteudo; } public void setNome(String nome) { this.nome = nome; } public void setTamanho(Long tamanho) { this.tamanho = tamanho; } public void setTsmodificacao(Timestamp tsmodificacao) { this.tsmodificacao = tsmodificacao; } // ------------------------------------------------------- @Transient public byte[] getContent() { return getConteudo(); } @Transient public String getName() { return getNome(); } @Transient public Long getCdfile() { if(getCdarquivo() == null){ return null; } return new Long(getCdarquivo().intValue()); } @Transient public String getContenttype() { return getTipoconteudo(); } @Transient public Long getSize() { return getTamanho(); } @Transient public Timestamp getTsmodification() { return getTsmodificacao(); } public void setContenttype(String contenttype) { setTipoconteudo(contenttype); } public void setContent(byte[] content) { setConteudo(content); } public void setCdfile(Long cdfile) { setCdarquivo(cdfile); } public void setName(String name) { setNome(name); } public void setSize(Long size) { setTamanho(size); } public void setTsmodification(Timestamp tsmodification) { setTsmodificacao(tsmodification); } } 1.2 arquivoDAOCrie o arquivoDAO, e extenda a classe FileDAO. Esta classe é responsável em gerenciar os arquivos, é ela quem define para que lugar o seu arquivo irá, se quando apagar um registro na tabela, ele também apaga o arquivo em questão.public class ArquivoDAO extends FileDAO { } 1.3 Arquivo Servicepublic class ArquivoService extends GenericService {} Fazendo o primeiro Upload de arquivo.Vamos supor que precisamos colocar uma foto de um funcionário, e para isso temos o seguinte bean:@SequenceGenerator(name = "generator", sequenceName = "generator") public class Funcionario{ protected Integer cdfuncionario; protected Arquivo arquivo; protected Sting nome; ..... //getters and setters omitidos } Criamos também o service e o dao: public class FuncionarioDAO extens GenericDAO{ } public class FuncionarioService extens GenericService{ } e o meu crud: @Controller(path="/x/crud/Funcionario", authorizationModule=CrudAuthorizationModule.class) public class FuncionarioCrud extends CrudController { } So que precisa complementar no DAO da sua tela.. ai adiciona isto, que vai injetar a instancia de arquivoDAO dentro do seu FuncionaDAO: ArquivoDAO arquivoDAO; public void setArquivoDAO(ArquivoDAO arquivoDAO) { this.arquivoDAO = arquivoDAO; } e adiciona mais isto na mesma classe: @Override public void updateSaveOrUpdate(final SaveOrUpdateStrategy save) { getTransactionTemplate().execute(new TransactionCallback(){ public Object doInTransaction(TransactionStatus status) { arquivoDAO.saveFile(save.getEntity(), "arquivo"); return null; } }); } O funcionamento deste trecho de código é o seguinte, Primeiro abrimos uma transaction para se caso acontecer algum erro no momento que for salvar o arquivo ele interrompa todo o processo de update, o segundo trecho que tem o "arquivoDAO.saveFile(save.getEntity(), "arquivo");" é para dizer ao arquivo DAO que ele precisa salvar o arquivo no banco e enviar o arquivo para uma pasta especificada, no caso o Neo pega o diretório padrão o HOME dir / dados / nome da aplicaçao / arquivos. A outra propriedade que seta no saveFile é ("arquivo") que é o nome da propriedade no seu bean, neste caso o bean de funcionário tem a propriedade arquivo, entao esta string recebe o nome de arquivo. Caso altere para outro nome, a string não se chamará arquivo, e sim o nome da propriedade que você colocou. Também é necessário carregar o bean de arquivo quando for usar, no caso na edição de dados. Então adicione mais o seguinte trecho no seu DAO: @Override public void updateEntradaQuery(QueryBuilder query) { query.leftOuterJoinFetch("funcionario.arquivo arquivo"); } A versão do Neo 3.4.5 os jsp's não irão ter alteração, mas a versão 3.4.6, nas tag's , e terá que ser incluído o atributo formEnctype="multipart/form-data" para ser enviado os arquivos para o controller. FuncionarioDAO completo: public class FuncionarioDAO extens GenericDAO{ ArquivoDAO arquivoDAO; public void setArquivoDAO(ArquivoDAO arquivoDAO) { this.arquivoDAO = arquivoDAO; } @Override public void updateEntradaQuery(QueryBuilder query) { query.leftOuterJoinFetch("funcionario.arquivo arquivo"); } @Override public void updateSaveOrUpdate(final SaveOrUpdateStrategy save) { getTransactionTemplate().execute(new TransactionCallback(){ public Object doInTransaction(TransactionStatus status) { arquivoDAO.saveFile(save.getEntity(), "arquivo"); return null; } }); } } Qualquer dúvida, postem no fórum! |
Últimas postagens
Alguem ainda usa o NEO?
Autor: Nunes
sem hibernate
Autor: csilva2001
Erro ao fazer update [RESOLVIDO]
Autor: Tchaco
Erro CrudController
Autor: edu_fernandes
Artigos, Livros e documentação
Autor: Nunes
Crud Master Detail
Autor: carlos ribeiro
[RESOLVIDO] Problema ao iniciar aplicação com NEO
Autor: R.Albany
gerar relatórios
Autor: mouzer
[RESOLVIDO] Missing required Java project: 'Neo'
Autor: r3n4n
The method ognl(String) in the type NeoFunctions is not applicable for the arguments ()
Autor: r3n4n
Dúvida com videos em flash e jsp
Autor: thiago cassimiro
Criptografar senhas Postgresql
Autor: labavel
Fazer upload da imagem em disco e no banco
Autor: labavel
Estilo no detalhe
Autor: Tchaco
Acessar o equivalente ao Neo.getUser() dentro da JSP
Autor: konkix
Dúvida de iniciante
Autor: Eder
Acesso a banco de dados
Autor: Nunes
Gravar Imagem no Banco
Autor: Tchaco
Campos AUTOCOMPLETE
Autor: vanessa
Assinatura Digital
Autor: biharck
Projeto NEO pode ser utilizado em um grande cliente do grande ABC.
Autor: Nunes
Layout Mestre Detalhe
Autor: viniciusst
Problemas com o type CPFCNPJ
Autor: viniciusst
Combo de Estado
Autor: viniciusst
Suporte a dois SGBD's Simultâneos
Autor: biharck
Many-to-Many
Autor: Tux
Gerando relatórios
Autor: viniciusst
Problemas com filtro listagem
Autor: vberga
Projeto descontinuado
Autor: viniciusst
Crud com erro - MySQL
Autor: viniciusst
Erro de cast no DAO
Autor: biharck
@DescriptionProperty Multiplos
Autor: joaopedro
Geração de tabelas - CRUD
Autor: Nunes
iReport
Autor: jlevi
Impressão de PDF em Bamatech MP20-MI
Autor: Alisson
Retorno - Novidades
Autor: vinicius.janones
CRUD Avançado
Autor: cassioseffrin
CRUD
Autor: miltonmmjr
Upload Multiplo de Imagem
Autor: robmsjr
Problema com anotação
Autor: tulio
Integração com Hibernate
Autor: Nunes
Dúvida quanto à referência a imagens
Autor: mmfalcao
Problema com atributo do tipo byte[]
Autor: tulio
Relacionamento Many to Many
Autor: LeonardoBH
Problema ao subir aplicação de upload de arquivos
Autor: cassioseffrin
Neo versão 3.4.0
Autor: pedro.goncalves
Problemas neo 3.4 + jboss 5 e Cascade no Hibernate
Autor: vberga
Erro ao anotar @Bean
Autor: edson.goncalez
Suporte a paginação
Autor: int80h
Menu vertical
Autor: fabricio.costa
|
Copyright © 2020 www.neoframework.com.br. Projeto sob a licença LGPL. |