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
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
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>
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 .
Configurando JSF e Extensões do MyFaces
Atualmente existe uma implementação da especificação JSF chamada Implementação de Referência do JSF (JSF Reference Implementation – RI) e existe uma outra provida pela Apache, que é conhecida como MyFaces. Podem existir outras implementações JSF, mas JSF RI e MyFaces são as mais populares. Muitos desenvolvedores preferem o primeiro porque ele é a implementação “oficial” da Sun, mas MyFaces possui algumas extensões interessantes, tais como o suporte a upload de arquivos. Você pode usar as extensões do MyFaces juntas com a JSF RI da Sun se você preferir. Você precisa apenas colocar o arquivo ...