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.java

Crie 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 arquivoDAO

Crie 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 Service

public 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!
Tutoriais
Ú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