Struts 2 : Problema com Upload de Arquivos

8 respostas
R

Bom dia pessoal,

Eu estou tentando implementar um upload de arquivos no meu sistema.

Fiz um outro projeto para testar o procedimento e ele funcionou muito bem...porém...
quando implementei isso no meu projeto, ele começou a me retornar a seguinte Exception:

WARNING: Error setting expression 'upload' with value '[Ljava.lang.String;@f7a68bc'
ognl.MethodFailedException: Method "setUpload" failed for object br.com.jm.actions.DemandaAction@5cda8984 [java.lang.NoSuchMethodException: br.com.jm.actions.DemandaAction.setUpload([Ljava.lang.String;)]

Ou seja, eu estaria tentando setar um campo do tipo File (private File upload), com um valor em String.

Mas...wtf?!?!

Não consigo entender porque ele converteria o valor do campo em uma String.

Pelo que pude notar, a unica diferença entre os 2 formulários (o da minha aplicaçao e a aplicaçao de teste), é que o formulario da minha aplicaçao envia outros valores
além do campo , já o formulário da aplicação de testes só estava enviando o mesmo.

Alguém de voces tem alguma tese?

Segue codigo do formulario:

<%@taglib prefix="s" uri="/struts-tags"%>
<%@taglib prefix="sj" uri="/struts-jquery-tags"%>
<div class="elBody">
	<div class="ui-widget-header elHeader">Demandas</div>
	<br>
	<s:if test="%{errorLog==true}">
		<sj:div id="errorLog" cssStyle="width: 99%; border-radius: 10px; background-color: #FFC1C1; padding: 4px;text-align:center;">
			Existem campos obrigatórios que devem ser preenchidos.
		</sj:div>
	</s:if>
	<s:form id="formIncluirDemanda" theme="simple" method="POST" enctype="multipart/form-data">
		<table style="width: 100%;">
			<tr>
				<td>Solicitação da Demanda: </td>
				<td><sj:autocompleter name="demanda.solic" list="listaSolics" listKey="solic" listValue="solic" selectBoxIcon="true" onSelectTopics="refreshFormDemanda"/></td>
			<s:if test="%{demanda.solic.equals('OUTRO')}">
				<td>Outro: </td>
				<td><s:textfield name="demanda.nsolic" required="true" onchange="upper(this);" size="30"/></td>
			</s:if>
			<tr>
				<td>Eleitor: </td>
				<td>
					<s:hidden name="demanda.eleitor.idEleitor"/>
					<s:textfield name="demanda.eleitor.nome" onchange="resize2EleNome();upper(this);publishTopic('detectEleitorTopics');" size="30"/>
					<sj:submit type="image" src="Imagens/lupa.png" cssStyle="width: 20px; height: 20px;" openDialog="popUpDialog2" href="demanda!findEleitor.action" formIds="formIncluirDemanda"/>
				</td>
				<td>Local: </td>
				<td><sj:autocompleter required="true" name="demanda.local" list="listaLocais" listKey="local" listValue="local" selectBoxIcon="true"/></td>
			</tr>
			<tr>
				<td>Descrição da Demanda: </td>
				<td colspan="3"><s:textfield name="demanda.desc" onchange="upper(this);" size="50" maxlength="200"/></td>
			</tr>
			<tr>
				<td>Setor: </td>
				<td><sj:autocompleter required="true" name="ocorrencia.setor.idSetor" list="listaSetores" listKey="idSetor" listValue="nome" onSelectTopics="refreshFormDemanda" onBlurTopics="refreshFormDemanda" selectBoxIcon="true"/></td>
				<td>Responsável: </td>
				<td><sj:autocompleter name="ocorrencia.responsavel.idUsuario" list="listaUsuarios" listKey="idUsuario" listValue="nome" selectBoxIcon="true"/></td>
			</tr>
			<tr>
				<td>Solicitação de Procedimento: </td>
				<td colspan="3"><s:textfield required="true" name="ocorrencia.solicitacao" onchange="upper(this);" size="50" maxlength="200"/></td>
			</tr>
			<tr>
				<td>Anexo: </td>
				<td colspan="3"><s:file name="upload"/></td>
			</tr>
			<tr>
				<td colspan="4" align="center">
					<sj:submit value="Incluir" button="true" targets="idDivContent" href="demanda!incluirDemanda.action" formIds="formIncluirDemanda" buttonIcon="ui-icon-gear"/>
					<sj:submit cssStyle="display:none;" targets="idDivContent" href="demanda!refreshFormDemanda.action" formIds="formIncluirDemanda" listenTopics="refreshFormDemanda"/>
				</td>
			</tr>
		</table>
	</s:form>
</div>

Segue codigo da Action:

package br.com.jm.actions;

import java.io.File;
import java.io.FileInputStream;
import java.io.FileNotFoundException;
import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.HashMap;
import java.util.List;
import java.util.Map;

import javax.servlet.ServletContext;

import org.apache.commons.io.FileUtils;
import org.apache.struts2.interceptor.SessionAware;
import org.apache.struts2.util.ServletContextAware;
import org.hibernate.exception.ConstraintViolationException;

import br.com.jm.beans.Atividade;
import br.com.jm.beans.Demanda;
import br.com.jm.beans.Eleitor;
import br.com.jm.beans.Ocorrencia;
import br.com.jm.beans.Setor;
import br.com.jm.beans.Usuario;
import br.com.jm.factory.DemandaFactory;
import br.com.jm.factory.EleitorFactory;
import br.com.jm.factory.LogFileFactory;
import br.com.jm.factory.OcorrenciaFactory;
import br.com.jm.factory.SetorFactory;
import br.com.jm.factory.UsuarioFactory;

import com.opensymphony.xwork2.ActionSupport;

public class DemandaAction extends ActionSupport implements SessionAware, Serializable, ServletContextAware{
	private static final long serialVersionUID = -6309610223718420989L;
	private Map<String, Object> session = new HashMap<String, Object>();
	private Map<String, Object> reportParams = new HashMap<String, Object>();
	private List<Demanda> listaDemandas = new ArrayList<Demanda>();
	private List<Ocorrencia> listaOcorrencias = new ArrayList<Ocorrencia>();
	private List<Ocorrencia> listaOcorrenciasSetor = new ArrayList<Ocorrencia>();
	private ServletContext servletContext;
	private List<Eleitor> listaEleitores = new ArrayList<Eleitor>();
	private List<Setor> listaSetores = new ArrayList<Setor>();
	private List<Demanda> listaLocais = new ArrayList<Demanda>();
	private List<Demanda> listaSolics = new ArrayList<Demanda>();
	private List<Usuario> listaUsuarios = new ArrayList<Usuario>();
	private List<Usuario> listaResponsaveis = new ArrayList<Usuario>();
	private List<Atividade> permissoes = new ArrayList<Atividade>();
	private Demanda demanda = new Demanda();
	private Ocorrencia ocorrencia = new Ocorrencia();
	private DemandaFactory df = new DemandaFactory();
	private EleitorFactory ef = new EleitorFactory();
	private SetorFactory sf = new SetorFactory();
	private UsuarioFactory uf = new UsuarioFactory();
	private OcorrenciaFactory of = new OcorrenciaFactory();
	private LogFileFactory lFac = new LogFileFactory();
	private int paginaAtual = 1;
	private int begin = 0;
	private int end = 0;
	private int paginas = 0;
        private double pgaux = 0;
        private int SpaginaAtual = 1;
	private int Sbegin = 0;
	private int Send = 0;
	private int Spaginas = 0;
	private int CpaginaAtual = 1;
	private int Cbegin = 0;
	private int Cend = 0;
	private int Cpaginas = 0;
	private Date reportDate = new Date();
	private boolean errorLog = false;
	private File upload;   
        private String uploadFileName;
        private String uploadContentType;
        private FileInputStream fileInputStream;
        private String caminho;
        private String contentDisposition;

        public String incluirDemanda(){
		if(session.get("usuario")==null){
			return "errorPerm";
		}else{
			if(checkValid(demanda, ocorrencia)){
				df.executeInsert(demanda);
				demanda.setAnexo(uploadFileName);
				lFac.executeInsert("INCLUSAO",(Usuario)session.get("usuario"),"DEMANDA",demanda.getIdDemanda());
				demanda = df.createOne(demanda);
				if(upload!=null && !upload.equals("")){
					copy();
				}
				ocorrencia.setDemanda(demanda);
				ocorrencia.setUsuario((Usuario)session.get("usuario"));
				of.executeInsert(ocorrencia);
				lFac.executeInsert("INCLUSAO",(Usuario)session.get("usuario"),"OCORRENCIA",ocorrencia.getIdOcorrencia());
				return "incluirDemanda";
			}else{
				errorLog = true;
				refreshFormDemanda();
				return "missInfo";
			}
		}
	}

        public String download(){
    	        try {
			fileInputStream = new FileInputStream(new File(caminho));
			contentDisposition = "attachment; filename=" + uploadFileName;
		} catch (FileNotFoundException e) {
			e.printStackTrace();
		}
	        return "download";
        }

        public void copy(){
    	    try {
                String filePath = servletContext.getRealPath("/Files/");
                String newFileName;
                if(uploadFileName.substring(uploadFileName.length()-4,uploadFileName.length()-3).equals("")){
                	newFileName = uploadFileName.substring(0, uploadFileName.length()-4)+"-"+demanda.getIdDemanda()+uploadFileName.substring(uploadFileName.length()-4);
                }else{
            	        newFileName = uploadFileName.substring(0, uploadFileName.length()-5)+"-"+demanda.getIdDemanda()+uploadFileName.substring(uploadFileName.length()-5);
                }
                File fileToCreate = new File(filePath, newFileName);
                FileUtils.copyFile(this.upload, fileToCreate);
                demanda.setCaminho(filePath+"\\"+newFileName);
            } catch (Exception e) {
                e.printStackTrace();
                addActionError(e.getMessage());
            }
        }  

        //GETTERS E SETTERS
}

8 Respostas

drsmachado

O que eu entendo deste erro é que

[java.lang.NoSuchMethodException: br.com.jm.actions.DemandaAction.setUpload([Ljava.lang.String;)]

O Struts 2 não achou teu método…

R

Sim, ele não achou porque nao existe mesmo!

Pois ele está tentando setar a variável upload com uma String, quando deveria setá-la com um File.

O metodo que tenho requer um objeto do tipo File, observe:

public File getUpload() {
		return upload;
	}

	public void setUpload(File upload) {
		this.upload = upload;
	}
drsmachado

Como está o struts.xml?

R

Segue struts.xml:

<action name="demanda!*" method="{1}" class="br.com.jm.actions.DemandaAction">
			<result name="createGrid">/caixaDeEntrada.jsp</result>
			<result name="createGridSetor">/caixaDeEntradaSetor.jsp</result>
			<result name="nextPage">/caixaDeEntrada.jsp</result>
			<result name="prevPage">/caixaDeEntrada.jsp</result>
			<result name="constViolation">/errorConstViolation.jsp</result>
			<result name="firstPage">/caixaDeEntrada.jsp</result>
			<result name="lastPage">/caixaDeEntrada.jsp</result>
			<result name="nextPageConsulta">/consultaDemandas.jsp</result>
			<result name="prevPageConsulta">/consultaDemandas.jsp</result>
			<result name="firstPageConsulta">/consultaDemandas.jsp</result>
			<result name="lastPageConsulta">/consultaDemandas.jsp</result>
			<result name="listOne">/formAlterarDemanda.jsp</result>
			<result name="refreshFormDemanda">/formIncluirDemanda.jsp</result>
			<result name="missInfo">/formIncluirDemanda.jsp</result>
			<result name="refreshFormRelatorioGeralDemanda">/formRelatorioGeralDemanda.jsp</result>
			<result name="fichaDemanda">/fichaDemanda.jsp</result>
			<result name="findEleitor">/findEleitorIncluirDemanda.jsp</result>
			<result name="exportarExcel">/consultaDemandasExcel.jsp</result>
//------------------------------------------------------------------------------------------------------
			<result name="incluirDemanda">/home.jsp</result>
//------------------------------------------------------------------------------------------------------
			<result name="excluirDemanda">/home.jsp</result>
			<result name="errorPerm">/errorPerm.jsp</result>
			<result name="detalharDemanda">/formAlterarDemanda.jsp</result>
			<result name="refreshConsultaDemanda">/sup-demandas.jsp</result>
			<result name="consultarDemandas">/consultaDemandas.jsp</result>
			<result name="alterarDemanda" type="chain">
				<param name="actionName">demanda!fichaDemanda</param>
			</result>
			<result name="gerarRelatorioGeralDemanda" type="jasper">
				<param name="location">relatorioGeralDemanda.jasper</param>
				<param name="dataSource">listaDemandas</param>
				<param name="reportParameters">reportParams</param>
				<param name="format">PDF</param>
			</result>
			<result name="gerarRelatorioSimplesDemandas" type="jasper">
				<param name="location">relatorioDemandasSimples.jasper</param>
				<param name="dataSource">listaDemandas</param>
				<param name="reportParameters">reportParams</param>
				<param name="format">PDF</param>
			</result>
			<result name="download" type="stream">
			  	<param name="contentType">application/octet-stream</param>
			 	<param name="inputName">fileInputStream</param>
			  	<param name="contentDisposition">${contentDisposition}</param>
			  	<param name="bufferSize">1024</param>
			</result>
		</action>
chienh

renangd,

a taglib “struts-jquery-tags” está enviando o formulário via ajax ? Se sim, dá uma procurada na internet sobre envio de formulários via ajax quando se tem campos do tipo “file”, costuma causar problemas mesmo.

Eu acredito que o problema possa estar aí.

[]'s

R

Bem observado cara…vou dar uma olhada nisso…

R

Bom, o problema é realmente esse.

O plugin que uso de ajax para o Struts 2 é o Jquery Plugin. Esse plugin não da suporte à envio de arquivos por ajax.

Será que alguem conhece alguma forma de enviar File via AJAX?

chienh

Dá uma olhada em: http://www.malsup.com/jquery/form

Criado 20 de setembro de 2012
Ultima resposta 24 de set. de 2012
Respostas 8
Participantes 3