10 de mar de 2009

Struts 2 - Como fazer upload

Segue um passo a passo de como fazer upload utilizando o Struts 2. A documentação oficial sobre este assunto pode ser encontrada em : http://struts.apache.org/2.1.6/docs/handling-file-uploads.html .  O processo é bastante simplificado pois o Struts 2 utiliza um Interceptor (fileUpload)  e a librarie Jakarta Commons FileUpload, esta semana precisei revisar este tópico, então segue aqui um rápido passo a passo:
1) A primeira coisa é mudar o s:form adicionando o enctype, fica assim: 

O que possitilita o upload é a entrada: enctype="multipart/form-data" que foi adicionado no form.

2) Utilizar um campo s:file no jsp
s:file name="foto" label="Sua foto"

3) Criar uma Action para receber a requisição. E registrá-la no struts.xml, ou conforme o tipo de configuração que estiver utilizando, o struts 2 tem um plugin "Zero Configuration" ou pode utilizar anotations também como opções. Como estamos utilizando o Interceptor para fazer o upload tudo o que tive que fazer na action foi declarar as seguintes propriedades e seus respectivos métodos setXXX

private File foto;
private String fotoFileName;
private String fotoContentType;

4) No método da action para tratar o arquivo escrevi o seguinte código: 
//pega ServletContext para definir um diretório para a foto.
   ServletContext sContext = ServletActionContext.getServletContext();
   //checa se o arquivo não é nulo.
   if(foto != null)
   {
    //direciona as fotos para este diretório.
    String diretorioFotos = sContext.getRealPath("/WEB-INF/fotos");
  
    //Cria o diretório se o mesmo não existir.
    File dirPath = new File(diretorioFotos);
       if (!dirPath.exists())
       {
        log.debug("diretorio nao existe criando==>> " + diretorioFotos);
           dirPath.mkdirs();
       }
  
       //salva a foto com o nome do e-mail do usário para evitar duplicidade.
    File arquivoSalvo = new File(diretorioFotos, getRequest().getSession().getAttribute("email").toString() + "." + getExtensaoArquivo());
  
    foto.renameTo(arquivoSalvo);
    log.debug("Content type: " + fotoContentType);
   }

E pronto, este é o processo básico para upload utilizando Struts 2 . Não entrei em detalhes de configurações que podem ser feitas como : tamanho máximo de arquivo, extensões válidas, etc. Para mais informações sobre estas questões ver as referências no site do struts 2 em(versão 2.1.6): 

e