Artigo WebMobile 19 - Efetuando Upload de Arquivos com JSF e MyFaces

Você precisa estar logado para dar um feedback. Clique aqui para efetuar o login
Para efetuar o download você precisa estar logado. Clique aqui para efetuar o login
Confirmar voto
0
 (0)  (0)

Primeiro explicaremos como o upload de arquivos funciona, mostrando aos leitores o código fonte do MyFaces e Commons File Upload, em seguinda, veremos uma aplicação de exemplo que permite ao usuário fazer upload de arquivos usando seus navegadores.

Esse artigo faz parte da revista WebMobile edição 19. Clique aqui para ler todos os artigos desta edição

imagem_pdf.jpg

Java Web

Efetuando Upload de Arquivos com JSF e MyFaces

Andrei Cioroianu

Browsers web provêm uma forma simples para envio de arquivos para aplicações web, mas as versões atuais dos padrões Java web (servlets, JSP e JSF) não oferecem qualquer ajuda. Felizmente, existem outros tipos de framework, tais como Apache Commons File Upload, Apache MyFaces e Oracle ADF Faces, que implementam esta funcionalidade, fornecendo simples APIs e tags customizadas. A primeira metade deste artigo explica como o upload de arquivos funciona, mostrando aos leitores o código fonte do MyFaces e Commons File Upload. Isso é útil para se conhecer o que acontece internamente nesses frameworks de código aberto para usá-los eficientemente e estar apto para modificá-los se necessário. Na segunda metade deste artigo, encontraremos uma aplicação de exemplo que permite ao usuário fazer upload de arquivos usando seus browsers web.

 

Upload de Arquivo baseado na Web

O termo "upload" é algo utilizado em demasia. Um webmaster diria que ele faz o upload de um arquivo quando ele o publica em seu website. Um desenvolvedor web diria que ele implementa upload de arquivo quando ele cria um formulário e um script que permite que usuários regulares enviem arquivos usando seus browsers web.

Existe alguma sobreposição entre esses dois significados, porque um webmaster pode usar uma interface baseada na web para publicar arquivos (páginas, imagens, scripts, etc.). Companhias que hospedam web sites pessoais gratuitamente, tais como Yahoo, implementa o upload de arquivo baseado na web para permitir que pessoas publiquem suas páginas. Isso permite que qualquer pessoa com um browser web e acesso a Internet publique um website pequeno. No entanto, existem muitas formas melhores para publicar seu conteúdo web, tais como FTP ou FTP seguro. Neste caso, você usaria uma aplicação dedicada, tais como um cliente FTP, ao invés de seu browser web para fazer upload de seu conteúdo para o servidor web.

Este artigo discute upload de arquivo a partir do ponto de vista do desenvolver web. Por exemplo, uma aplicação de e-mail baseada na web, tal como Yahoo mail, implementa upload de arquivo de forma que os usuários possam enviar mensagens com anexos. Outro bom exemplo é um website de emprego que permite que você envie seu currículo para ser consultado. A aplicação de exemplo deste artigo computa os valores dos arquivos que fizeram upload. Você pode fazer qualquer coisa que você desejar com os arquivos carregados na aplicação, tais como armazenar seu conteúdo num banco de dados ou enviá-lo como anexo em um e-mail. Agora, vamos ver como implementar o upload de arquivos em uma aplicação web.

Um formulário HTML pode conter um ou mais elementos que o browser renderiza como campos de entrada, onde usuários podem entrar com caminhos de arquivo. Próximo a cada campo de entrada de arquivo, o browser web adiciona um botão que abre uma caixa de diálogo de arquivo, permitindo aos usuários selecionar um arquivo ao invés de entrar com o caminho (ver Figura 1).

Figura 1. Formulário web contendo um campo de entrada de arquivo

 Quando o usuário clica no botão Submit do formulário, o browser web codifica os dados do formulário, que inclui o conteúdo do arquivo selecionado junto com seu nome (ou caminho) e outros parâmetros do formulário. Então, o browser envia os dados do formulário codificado para o servidor web, que passa esses dados ao script especificado como atributo de ação da tag

. Se você desenvolve uma aplicação web em Java, o script de ação pode ser um servlet ou uma página JSP.

Visto que a codificação padrão dos dados do formulário e o método GET padrão não são adequados para upload de arquivo, um formulário que contém campos de entrada de arquivos deve especificar a codificação multipart/form-data e o método POST na tag (Listagem 1).

 

Listagem 1. Forma de codificação e uso do método POST                                    

 

<form enctype="multipart/form-data" method="POST" action="...">

    ...

    <input type="file" name="...">

    ...

</form>

 

As coisas não são tão simples como elas parecem visto que servidores de aplicação implementando o servlet e especificações JSP não são requeridos para tratar a codificação multipart/form-data. Portanto, você precisa de um parser para o stream de entrada da requisição, tais como Apache Commons File Upload, que é um pequeno pacote Java que permite que você obtenha o conteúdo do arquivo carregado a partir dos dados codificados do formulário. A API deste pacote é flexível, permitindo que você mantenha arquivos pequenos na memória enquanto arquivos grandes são armazenados em disco em um diretório temporário. Você pode especificar o tamanho size que será o patamar para os arquivos serem escritos no disco ao invés de mantê-los na memória, e você pode também especificar o tamanho máximo que é permitido para os arquivos que serão enviados via upload.

O pacote org.apache.commons.fileupload contém uma classe chamada DiskFileUpload da qual o método parseRequest() recebe um parâmetro HttpServletRequest e retorna uma Lista de instâncias de org.apache.commons.fileupload.FileItem. Os dados codificados do formulário são lidos a partir do stream retornado pelo método getInputStream() da requisição do servlet. O nome FileItem é algo enganoso, pois as instâncias dessa interface representam arquivos carregados e parâmetros de requisição regular.

A API provida pelo pacote Commons File Upload dá ao usuário acesso aos dados transformados, mas os métodos getParameter() e getParameterValues() da requisição do servlet não funciona. Este é um problema, pois esses dois métodos são chamados pelos componentes padrões do JSF que rodam campos de entrada regulares, checkboxes, radio buttons e listas. A API do servlet provê duas funcionalidades (filters e request wrappers) que podem ser usadas para resolver este problema. A próxima seção descreve como o Apache MyFaces implementa um filtro que adiciona o apoio much-needed para upload de arquivo sem afetar os componentes JSF existentes. Além disso, MyFaces provê APIs para JavaBeans junto com um componente JSF customizado que renderiza os elementos .

 

Ficou com alguma dúvida?