Assim como ocorrido no tópico que criei de Geração de Relatórios em JPEG com JasperReport, http://www.guj.com.br/posts/list/75418.java, eu consegui achar a solução antes de uma resposta com esta aqui no fórum, e estou deixando aqui um exemplo realmente prático de utilização de FileUpload com Jakarta ao invés de simplesmente falar que ele é fácil.
Agradeço de coração àqueles que colaboraram nos outros tópicos com ajudas que me levaram a muitas reflexões como Puka, o Furutani e o Leogazio!
Para estas pessoas e para as que procuram por uma maneira mais fácil de programar aí vai o código fornecido pelo Christiano Rodarte Vale no site http://www.devmedia.com.br/articles/viewcomp.asp?comp=3572&hl=!
Download do FileUpload 1.1.1
http://jakarta.apache.org/commons/fileupload/index.html
Download do org.apache.commons.io (macete que aprendi por fora - PACOTE REQUERIDO)
http://www.java2s.com/Code/Jar/Apache-Common/Downloadcommonsio132jar.htm
Definindo um formulário para o envio do arquivo
Como exemplo, vamos fazer o upload de uma imagem para o servidor. Um formulário simples deve ser criado em HTML para levar a imagem até nossa aplicação. Este formulário deve obrigatoriamente ser do tipo ?multipart/form-data":
[code]
<input type=“submit” id=“upload” name=“upload” tabindex=“2” style="position:absolute; top:20px; left:532px; >
[/code]
Criando o Servlet
[code]import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.FileUpload;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileUploadException;
public class ServletUpload extends HttpServlet{
//Initialize global variables
public void init() throws ServletException {
}
//Process the HTTP Post request
public void doPost(HttpServletRequest request, HttpServletResponse response)
throws ServletException, IOException {
doGet(request, response);
}
//Process the HTTP Get request
public void doGet(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
boolean isMultiPart = FileUpload.isMultipartContent(request);
if (isMultiPart) {
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
String formulario = "";
try {
List items = upload.parseRequest(request);
Iterator iter = items.iterator();
while (iter.hasNext()) {
FileItem item = (FileItem) iter.next();
if (item.getFieldName().equals("tipoForm")) {
formulario = item.getString();
}
if (!item.isFormField()) {
if (item.getName().length() > 0) {
this.inserirImagemDiretorio(item);
}
}
}
} catch (FileUploadException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
}
// implementação de demais métodos do Servlet.
}[/code]
Gravando e recuperando a Imagem em um diretório do servidor
criar uma outra tabela no Banco de Dados conforme a estrutura a seguir:
TabelaTeste2
Codigo (Integer)
Imagem (Varchar)
CREATE TABLE TabelaTeste2 (
codigo INT UNSIGNED NOT NULL,
imagem VARCHAR (255)
);
Agora vamos escrever o método inserirImagemDiretorio(FileItem item) que irá realizar duas tarefas:
1 ? Guardar a imagem em um diretório do servidor;
2 ? Guardar no Banco de dados o endereço para recuperação desta imagem;
[code] /**
*
* @param item FileItem, representa um arquivo que é enviado pelo formulario
* MultiPart/Form-data
* @throws IOException
*/
private void inserirImagemDiretorio(FileItem item) throws IOException {
//Pega o diretório /logo dentro do diretório atual de onde a
//aplicação está rodando
String caminho = getServletContext().getRealPath("/logo") + "/";
// Cria o diretório caso ele não exista
File diretorio = new File(caminho);
if (!diretorio.exists()){
diretorio.mkdir();
}
// Mandar o arquivo para o diretório informado
String nome = item.getName();
String arq[] = nome.split("\\\\");
for (int i = 0; i < arq.length; i++) {
nome = arq[i];
}
File file = new File(diretorio, nome);
FileOutputStream output = new FileOutputStream(file);
InputStream is = item.getInputStream();
byte[] buffer = new byte[2048];
int nLidos;
while ((nLidos = is.read(buffer)) >= 0) {
output.write(buffer, 0, nLidos);
}
output.flush();
output.close();
//Guarda no banco de dados o endereço para recuperação da imagem
Connection conexao = null;
/**
Estabeleça a conexão
*/
PreparedStatement declaracao = null;
String sql = “INSERT INTO TabelaTeste2 (codigo, imagem) VALUES(?, ?)”;
try {
declaracao = conexao.prepareStatement(sql);
declaracao.setInt(1, 1); // codigo 1
declaracao.setString(2, caminho);
resultado = declaracao.executeUpdate();
} catch (SQLException sqlEx) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
}
[/code]
Escrevendo o método recuperarImagemDiretorio():
[code]public ImageIcon recuperaImagemDiretorio() {
Connection conexao = null;
/**
Estabeleça a conexao
*/
Statement declaracao = null;
ResultSet resultado = null;
StringBuffer sql = new StringBuffer();
sql.append(“SELECT imagem FROM tabelaTeste2 WHERE codigo = 1”);
ImageIcon imagem = null;
try {
declaracao = conexao.createStatement();
resultado = declaracao.executeQuery(sql.toString());
if (resultado.next()) {
String caminhoImagem = resultado.getString("imagem");
if (caminhoImagem!=null){
imagem = new ImageIcon(caminhoImagem);
}
}
} catch (SQLException ex) {
ex.printStackTrace();
} catch (Exception ex) {
ex.printStackTrace();
}
return imagem;
}
[/code]
Esta é a seleção que eu usei do Christiano Rodarte Vale. O artigo na íntegra se encontra no site citado acima. Conforme mencionado no inínio desta mensagem, a biblioteca Jakarta FileUpload precisa de uma outra biblioteca para funcionar: a org.apache.commons.io. Para o correto funcionamento da Jakarta FileUpload é [color=red]NECESSÁRIO O DOWNLOAD DA ORG.APACHE.COMMONS.IO[/color]!!
Este exemplo é um ótimo “osso” que pode ser customizado para qualquer necessidade!!
Abraços!!!