quarta-feira, 20 de janeiro de 2010

Upload de arquivos em Java Struts

Cá estou eu novamente... ansioso pelo treinamento da semana que vem (ESRI - ArcObjects com Java e Aplicações com ArcGIS Server JAVA) e Também esperançoso pelos belos horizontes que estão por vir.


Vamos ao que importa, hoje estava escrevendo uma classe simples para um amigo de upload de arquivos no framework Struts.




Aqui temos a classe Action:

package br.cbenato.upload;

import java.io.File;
import java.io.FileOutputStream;
import java.io.OutputStream;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import org.apache.commons.fileupload.FileUpload;
import org.apache.struts.action.Action;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionForward;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.action.ActionMessage;
import org.apache.struts.action.ActionMessages;
import org.apache.struts.upload.FormFile;

public class UploadAction extends Action {

    @Override
    public ActionForward execute(ActionMapping mapping, ActionForm form, HttpServletRequest request, HttpServletResponse response)
            throws Exception {
        boolean isMultipart = FileUpload.isMultipartContent(request);
        boolean uploadDone = false;
        ActionErrors errors = new ActionErrors();
        ActionForward forward = new ActionForward();
        //Verificando se é uma requisição multipart
        if (isMultipart) {
            // Pegando o formulário
            UploadForm uploadForm = (UploadForm) form;
            //Pegando o File do formulário
            FormFile formFile = uploadForm.getMyFile();
            //Pegando o nome do arquivo
            String strFileName = formFile.getFileName();
            //Pegando os dados contidos dentro do arquivo que foi feito o upload
            byte dataFile[] = formFile.getFileData();
            //Realizando a criação do arquivo
            File file = new File("C:\\" + strFileName);
            //Criando um output stream... é como se fosse ligado uma mangueira no arquivo e você vá bombear os dados através dessa mangueira
            OutputStream out = new FileOutputStream(file);
            //Aqui os dados são bombeados para o arquivo
            out.write(dataFile);
            //Aqui é espremido a mangueira para enviar todos os dados e uma chacoalhada no balde para acomodar os dados
            out.flush();
            //Retirado a mangueira do balde(Arquivo)
            out.close();
            //Variável para confirmar que o upload foi concluido
            uploadDone = true;
        } else {
            //Adicionando o erro
            errors.add(
                    ActionMessages.GLOBAL_MESSAGE,
                    new ActionMessage("erro-upload"));
        }
        if (uploadDone == false) {
            errors.add(
                    //Adicionando mais erros caso não consiga concluir o upload
                    ActionMessages.GLOBAL_MESSAGE,
                    new ActionMessage("erro-upload"));
        }
        if (errors.isEmpty() == false) {
            //Caso haja falhar salvar os erros e definir forward como FAIL
            saveErrors(request, errors);
            forward = mapping.findForward("FAIL");
        } else {
            //Caso o upload tenha concluido sem problemas define forward como SUCCESS
            forward = mapping.findForward("SUCCESS");
        }
        //RETORNA FAIL OU FORWARD
        return (forward);
    }
}




E Aqui a classe Form:

package br.cbenato.upload;

import javax.servlet.http.HttpServletRequest;
import org.apache.struts.action.ActionErrors;
import org.apache.struts.action.ActionForm;
import org.apache.struts.action.ActionMapping;
import org.apache.struts.upload.FormFile;

/**
 *
 * @author Cristiano Benato
 */
public class UploadForm extends ActionForm {
    private FormFile myFile = null;
    public FormFile getMyFile() {
        return myFile;
    }
    public void setMyFile(FormFile file) {
        myFile = file;
    }
    @Override
    public void reset(ActionMapping mapping, HttpServletRequest request) {
        myFile = null;
    }
    @Override
    public ActionErrors validate(ActionMapping mapping, HttpServletRequest request) {
        ActionErrors errors = new ActionErrors();
        return errors;
    }
}



E agora o Action e o bean que devem ser colocados no struts-config:

<form-bean name="uploadForm" type="br.cbenato.upload.UploadForm"/>
        
       <action path="/upload" type="br.cbenato.upload.UploadAction" name="uploadForm" validate="true">
            <forward name="SUCCESS" path="/upload2.jsp"/>
            <forward name="FAIL" path="/erro.jsp"/>
        </action>



Enfim as páginas:



upload.JSP

<%--
    Document   : Upload
    Created on : 20/01/2010, 17:43:50
    Author     : Cristiano Benato
--%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
    <HEAD>
        <%@ taglib uri="http://struts.apache.org/tags-bean" prefix="bean" %>
        <%@ taglib uri="http://struts.apache.org/tags-html" prefix="html" %>
        <%@ taglib uri="http://struts.apache.org/tags-logic" prefix="logic" %>

        <%@ page language="java" contentType="text/html; charset=ISO-8859-1" pageEncoding="ISO-8859-1" %>

        <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <META http-equiv="Content-Style-Type" content="text/css">
        <TITLE>Upload - Cristiano Benato</TITLE>
    </HEAD>
    <BODY>
        <html:form action="/upload.do" enctype="multipart/form-data">
            Escolha o arquivo:<html:file property="myFile"/><br>
            <html:submit value="Upload File"/>
        </html:form>
    </BODY>
</HTML>











-upload2.JSP
<%--
    Document   : upload2
    Created on : 20/01/2010, 17:30:10
    Author     : Cristiano Benato
--%>

<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<HTML>
    <HEAD>
        <META http-equiv="Content-Type" content="text/html; charset=ISO-8859-1">
        <META name="GENERATOR" content="IBM WebSphere Studio">
        <META http-equiv="Content-Style-Type" content="text/css">
        <TITLE>Upload de Arquivos</TITLE>
    </HEAD>
    <BODY>
        <h1>Upload realizado com sucesso.</h1:>
    </BODY
</HTML>







-erro.JSP
<%--
    Document   : Erro
    Created on : 05/01/2010, 18:52:52
    Author     : Cristiano Benato
--%>

<%@page contentType="text/html" pageEncoding="UTF-8"%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN"
   "http://www.w3.org/TR/html4/loose.dtd">
<html>
    <head>
        <meta http-equiv="Content-Type" content="text/html; charset=UTF-8">
        <title>ERRO UPLOAD - Cristiano Benato</title>
    </head>
    <body>
        <h1>Erro no upload!!!!!!!!!!!!!</h1>
    </body>
</html>