struts-user mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Pablo Vázquez Blázquez <pvazq...@denodo.com>
Subject Re: File Upload
Date Thu, 17 Jan 2008 16:13:26 GMT
Here I send you my JSP and Action code.

Yes, when I submit, the new plugin is added (I know it because of my 
logs), but I don´t know why I don´t get the result page.

Thank you.

PD: I have now tried without struts.multipart.parser, but it doesn´t work.

****** JSP ******

<jsp:root xmlns="http://www.w3.org/1999/xhtml"
    xmlns:jsp="http://java.sun.com/JSP/Page"
    xmlns:fmt="http://java.sun.com/jsp/jstl/fmt"
    xmlns:c="http://java.sun.com/jsp/jstl/core"
    xmlns:s="/struts-tags"
    version="2.0">
    
    <!-- Tabla con los plugins. Si no hay ninguno, se muestra un mensaje -->
    <table class="pluginsTable" cellspacing="0px" cellpadding="3px" border="1px">
        <tbody>
            <tr>
                <td class="tableTitle" colspan="5">
                    <fmt:message key="PluginsTable.Title"/>
                </td>
            </tr>
            <tr>
                <td class="tableHeader">
                    <fmt:message key="PluginsTable.Name"/>
                </td>
                <td class="tableHeader">
                    <fmt:message key="PluginsTable.JarFile"/>
                </td>
                <td class="tableHeader">
                    <fmt:message key="PluginsTable.PluginClass"/>
                </td>
                <td class="tableHeader">
                    <fmt:message key="PluginsTable.Type"/>
                </td>
                <td class="tableHeader">
                    <fmt:message key="PluginsTable.Actions"/>
                </td>
            </tr>
            <c:if test="${empty plugins}">
                <tr>
                    <td class="tableMessage" colspan="5">
                        <fmt:message key="PluginsTable.NoPlugins"/>
                    </td>
                </tr>
            </c:if>
            <c:forEach items="${plugins}" var="plugin" varStatus="status">
                <!-- stuff -->
            </c:forEach>
        </tbody>
    </table>
    
    
    <!-- Form to add plugin -->
    <s:form id="addPluginForm" name="addPluginForm" theme="ajax" 
            action="AddPlugin" enctype="multipart/form-data" method="post">
        
        <div class="field">
            <span class="label">
                <fmt:message key="PluginsTable.File"/>*:
            </span>
            <span class="entry">
                <s:file name="upload" size="40"
                    accept="application/java-archive"/>
                <span id="errorId" class="errorMessage">
                    <s:property value="fieldErrors['upload'][0]" />
                </span>
                <span id="errorId" class="errorMessage">
                    <s:property value="fieldErrors['uploadContentType'][0]" />
                </span>
            </span>
        </div>
        
        <!-- BOTONES -->
        <jsp:directive.include file="FormButtons.jspf"/>
        
    </s:form>
    
</jsp:root>


****** FORMBUTTONS.JSPF****

<!-- BUTTONS-->
<div class="button">
    <span class="buttonLeft">
        <s:submit type="button"  
                targets="configAjaxContent" executeScripts="true"
                showLoadingText="false" indicator="indicator" cssClass="submit">
            <s:param name="value">
                <fmt:message key="Buttons.accept"/>
            </s:param>
        </s:submit>
    </span>
    <span class="buttonRight">
        <!-- cancelar -->
        <s:url id="CancelUrl" action="CancelConfiguration"/>
        <s:submit type="button" targets="configAjaxContent" 
                showLoadingText="false" cssClass="reset" href="${CancelUrl}">
            <s:param name="value">
                <fmt:message key="Buttons.cancel"/>
            </s:param>
        </s:submit>
    </span>
</div>



*****ACTION *****
public class AddPluginAction extends DefaultRequestResponseAction {

    private static final long serialVersionUID = 1516786859681901796L;
    
    /**
     * Logger for this class
     */
    private static final Log log = LogFactory.getLog(AddPluginAction.class);
    
    private File upload;
    private String uploadContentType;
    private String uploadFileName;
    
    @Override
    protected String doExecute() throws Exception {
        
        clearErrorsAndMessages();

        Context context = 
            SessionManager.getRemoteServerContext(getRequest());

        SchedulerManager facade = 
            SessionManager.getUserFacadeDelegate(getRequest(), context);
        
        try {
            
            byte[] filedata = readInputStream(new FileInputStream(upload));
            
            facade.addPlugin(uploadFileName, filedata);
            
            log.debug("Anadido plugin " + uploadFileName);
            
        } catch (ConnectException e) {
            log.error(e);
            throw new InternalErrorException(e);
            
        } catch (DuplicateInstanceException e) {
            log.error(e);
            addFieldError("upload",
                    getText("PluginsTable.File.Duplicate"));
        
        } catch (FileNotFoundException e) {
            log.error(e);
            addFieldError("upload",
                    getText("PluginsTable.File.NotFound"));
            
        } catch (Exception e) {
            log.error(e);
            addFieldError("uploadContentType",
                    getText("ErrorMessages.file.incorrectExtension"));
        }
        
        if (hasErrors()) {
            return Action.INPUT;
        }
        
        return Action.SUCCESS;
    }
    

    /*
     * Read an input stream in its entirety into a byte array 
     */
    private static byte[] readInputStream(InputStream inputStream) 
        throws IOException {

        ....

        return content;
    }
    
    /**
     * Getters/Setters
     * @return
     */
    
    public File getUpload() {
        return upload;
    }


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


    public String getUploadContentType() {
        return uploadContentType;
    }


    public void setUploadContentType(String uploadContentType) {
        this.uploadContentType = uploadContentType;
    }


    public String getUploadFileName() {
        return uploadFileName;
    }


    public void setUploadFileName(String uploadFileName) {
        this.uploadFileName = uploadFileName;
    }

}




Dave Newton escribió:

> --- Pablo Vázquez Blázquez <pvazquez@denodo.com> wrote:
>   
>> I send you my struts-config.xml file, but it works ok. If I delete my 
>> "s:file" from my form, everything works fine.
>>     
>
> The error happens after you submit, correct?
>
> I guess I'd want to see the JSP and the action code, then; the configuration
> seems okay.
>
> Have you tried it without setting the "struts.multipart.parser" constant? The
> default value of that is "jakarta", not a classname; it's worth a shot,
> anyway.
>
> d.
>
>   
>> To see the action involved search:  <!-- HERE IS THE PROBLEM -->
>>
>>
>> <?xml version="1.0" encoding="UTF-8" ?>
>> <!DOCTYPE struts PUBLIC
>>     "-//Apache Software Foundation//DTD Struts Configuration 2.0//EN"
>>     "http://struts.apache.org/dtds/struts-2.0.dtd">
>>
>> <struts>
>>
>>     <constant name="struts.enable.DynamicMethodInvocation" value="false" />
>>     <constant name="struts.devMode" value="true" /> <!-- TODO: cambiar a

>> false en produccion -->
>>     <constant name="struts.action.extension" value="do"/>
>>     <constant name="struts.ui.theme" value="simple"/>
>>     <constant name="struts.multipart.parser"
>>         
>> value="org.apache.struts2.dispatcher.multipart.JakartaMultiPartRequest"/>
>>    
>>    
>>     <!-- Internacionalizacion para los tags de struts 2 -->
>>     <constant name="struts.custom.i18n.resources"
>>         value="admintool.http.view.messages.Messages"/>
>>    
>>     <include file="struts-default.xml"/>
>>
>>     <!-- ===== Paquetes ===== -->
>>     <package name="scheduler" extends="struts-default">
>>    
>>         <!-- ===== Resultados globales ===== -->
>>         <result-types>
>>             <result-type name="tiles"
>>                 class="org.apache.struts2.views.tiles.TilesResult"/>
>>         </result-types>
>>    
>>         <!-- ===== Interceptors ===== -->
>>         <interceptors>
>>
>>             <interceptor name="session"
>>                 
>> class="admintool.http.controller.interceptors.SessionInterceptor" />
>>                
>>             <interceptor name="login"
>>                 
>> class="admintool.http.controller.interceptors.AuthenticationInterceptor" />
>>            
>>             <interceptor-stack name="defaultLoginStack">
>>                 <interceptor-ref name="exception" />
>>                 <interceptor-ref name="alias" />
>>                 <interceptor-ref name="servlet-config" />
>>                 <interceptor-ref name="session" />
>>                 <interceptor-ref name="login" />
>>                 <interceptor-ref name="prepare" />
>>                 <interceptor-ref name="i18n"/>
>>                 <interceptor-ref name="chain" />
>>                 <interceptor-ref name="model-driven" />
>>                 <interceptor-ref name="fileUpload" />
>>                 <interceptor-ref name="static-params" />
>>                 <interceptor-ref name="params" />
>>                 <interceptor-ref name="conversionError" />
>>                 <interceptor-ref name="validation" />
>>                 <interceptor-ref name="workflow" />
>>             </interceptor-stack>
>>    
>>             <interceptor-stack name="defaultInsecureStack">
>>                 <interceptor-ref name="exception" />
>>                 <interceptor-ref name="alias" />
>>                 <interceptor-ref name="servlet-config" />
>>                 <interceptor-ref name="session" />
>>                 <interceptor-ref name="prepare" />
>>                 <interceptor-ref name="i18n"/>
>>                 <interceptor-ref name="chain" />
>>                 <interceptor-ref name="model-driven" />
>>                 <interceptor-ref name="fileUpload" />
>>                 <interceptor-ref name="static-params" />
>>                 <interceptor-ref name="params" />
>>                 <interceptor-ref name="conversionError" />
>>                 <interceptor-ref name="validation" />
>>                 <interceptor-ref name="workflow" />
>>             </interceptor-stack>
>>            
>>             <!-- Sample file upload stack -->
>>             <interceptor-stack name="fileUploadStack">
>>                 <interceptor-ref name="fileUpload"/>
>>                 <interceptor-ref name="basicStack"/>
>>             </interceptor-stack>
>>        
>>         </interceptors>
>>
>>         <!--
>>             Make the defaultLoginStack the default one used
>>             for all actions unless otherwise configured.
>>         -->
>>         <default-interceptor-ref name="defaultLoginStack" />
>>    
>>         <!-- ===== Resultados globales ===== -->
>>         <!-- se corresponden con los valores por defecto devueltos por 
>> Action (ej: error, login) -->
>>         <global-results>
>>             <result name="login" 
>> type="redirect-action">ShowAuthentication</result>
>>             <result name="MainPage" 
>> type="redirect-action">Workspace</result>
>>             <result 
>> name="error">/HTML/tiles/base/InternalError.jspx</result>
>>             <result name="exito">/HTML/tiles/base/SuccessPage.jspx</result>
>>         </global-results>
>>        
>>         <!-- ===== Secciones principales ===== -->
>>         <action name="Workspace">
>>             <result type="tiles">.Workspace</result>
>>         </action>
>>        
>>         <action name="Scheduler">
>>             <result type="tiles">.Scheduler</result>
>>         </action>
>>        
>>         <action name="Configuration">
>>             <result type="tiles">.Configuration</result>
>>         </action>
>>
>>         <!-- ===== Autenticacion ===== -->
>>         <!-- Accion que muestra el formulario de autenticacion -->
>>         <action name="ShowAuthentication"
>>             
>> class="admintool.http.controller.actions.users.ShowAuthenticationAction">
>>             <interceptor-ref name="defaultInsecureStack"/>
>>             <result type="tiles">.Login</result>
>>         </action>
>>        
>>         <!-- Ejecuta la accion de login. Si hay fallos, vuelve a la 
>> misma pagina -->
>>         <action name="Login"
>>                
>> class="admintool.http.controller.actions.users.LoginAction">
>>             <interceptor-ref name="defaultInsecureStack"/>
>>             <result name="input" type="tiles">.Login</result>
>>         </action>
>>        
>>         <!-- Cierra la sesion y vuelve a la pagina de login  -->
>>         <action name="Logout"
>>                 
>> class="admintool.http.controller.actions.users.LogoutAction">
>>             <interceptor-ref name="defaultInsecureStack"/>
>>         </action>
>>                
>>         <!-- ===== Configuration ===== -->
>>        
>>         <action name="CancelConfiguration">
>>             <result>/HTML/tiles/configuration/ConnectionInfo.jspx</result>
>>         </action>
>>        
>>         <action name="ShowChangePassword">
>>             <result>/HTML/tiles/configuration/ChangePassword.jspx</result>
>>         </action>
>>        
>>         <action name="ChangePassword"
>>                 
>>
>>     
> class="admintool.http.controller.actions.configuration.ChangePasswordAction">
>   
>>             <result 
>> name="input">/HTML/tiles/configuration/ChangePassword.jspx</result>
>>         </action>
>>        
>>         <action name="ShowChangeServer">
>>             <result>/HTML/tiles/configuration/ChangeServer.jspx</result>
>>         </action>
>>        
>>         <action name="ChangeServer"
>>                 
>> class="admintool.http.controller.actions.configuration.ChangeServerAction">
>>             <result 
>> name="input">/HTML/tiles/configuration/ChangeServer.jspx</result>
>>         </action>
>>        
>>         <action name="ShowChangeRemotePort">
>>            
>> <result>/HTML/tiles/configuration/ChangeRemotePort.jspx</result>
>>         </action>
>>        
>>         <action name="ChangeRemotePort"
>>                 
>>
>>     
> class="admintool.http.controller.actions.configuration.ChangeRemotePortAction">
>   
>>             <result 
>> name="input">/HTML/tiles/configuration/ChangeRemotePort.jspx</result>
>>         </action>
>>        
>>         <action name="ShowChangeMail">
>>             <result>/HTML/tiles/configuration/ChangeMail.jspx</result>
>>         </action>
>>        
>>         <action name="ChangeMail"
>>                 
>> class="admintool.http.controller.actions.configuration.ChangeMailAction">
>>             <result 
>> name="input">/HTML/tiles/configuration/ChangeMail.jspx</result>
>>         </action>
>>        
>>         <action name="ShowChangeThreads">
>>
>>     
> === message truncated ===
>
>
> ---------------------------------------------------------------------
> To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
> For additional commands, e-mail: user-help@struts.apache.org
>
>   


---------------------------------------------------------------------
To unsubscribe, e-mail: user-unsubscribe@struts.apache.org
For additional commands, e-mail: user-help@struts.apache.org


Mime
View raw message