Uploaded image for project: 'Struts 1'
  1. Struts 1
  2. STR-1394

[upload] File upload maximum size validator

    XMLWordPrintableJSON

Details

    • Improvement
    • Status: Open
    • Minor
    • Resolution: Unresolved
    • 1.4.0
    • None
    • Core
    • None
    • Operating System: All
      Platform: All
    • 18981

    Description

      There is a class which is checking if the size of uploaded file is not bigger
      then allowed in validator.xml. Right now it exists as separate Validor class,
      but the idea is to incorporate it into the Struts. In this version it works
      checking both DynaForm and "static" forms. I was able to build DynaForm, wchich
      contains fields org.apache.struts.upload.FormFile without the problem.

      There is the code of the class with incorporated documentation:
      <code>
      /*

      • Created on Apr 3, 2003
        *
        */
        package org.yourek.struts.validator;

      import java.lang.reflect.InvocationTargetException;
      import java.lang.reflect.Method;

      import javax.servlet.http.HttpServletRequest;

      import org.apache.commons.validator.Field;
      import org.apache.commons.validator.ValidatorAction;
      import org.apache.struts.action.ActionErrors;
      import org.apache.struts.upload.FormFile;
      import org.apache.struts.validator.Resources;
      import org.apache.commons.beanutils.DynaBean;

      /**

      • @author Jerzy Puchala
        *
        */
        public class FileSizeValidator {
        /**
      • <p>Checks if the file uploaded from this field is smaller than value
        in var attribute.
      • You can use pure Byte number in <var-value> or you may use B -
        for Bytes,
      • KB - for Kiloytes, MB - for Megabytes and GB - for Gigabytes. (I
        hope you will not
      • upload this way Terabytes)</p>
      • To make this class work you have to:<br>
      • 1. Add something simmilar to your validate.xml
      • <pre>
        <validator name="maxfilesize"
        classname="org.yourek.struts.validate.FileSizeValidator"
        method="validateMaxFileSize"
        methodParams="java.lang.Object,

      org.apache.commons.validator.ValidatorAction,
      org.apache.commons.validator.Field,
      org.apache.struts.action.ActionErrors,
      javax.servlet.http.HttpServletRequest"
      msg="errors.maxfilesize" />

      <field property="smallPictFile" depends="maxfilesize">
      <arg0 name="maxfilesize" key="${var:maxFileSize}"
      resource="false" />
      <var>
      <var-name>maxFileSize</var-name>
      <var-value>100KB</var-value>
      </var>
      </field>
      </pre>

      • <br>
      • 2. Add to the validator-rules.xml as follow:<br>
      • <pre>
        <validator name="maxfilesize"
        classname="org.yourek.struts.validator.FileSizeValidator"
        method="validateMaxFileSize"
        methodParams="java.lang.Object,

      org.apache.commons.validator.ValidatorAction,
      org.apache.commons.validator.Field,
      org.apache.struts.action.ActionErrors,
      javax.servlet.http.HttpServletRequest"
      depends=""
      msg="errors.maxfilesize">

      <javascript><![CDATA[
      function validateMaxFileSize(form)

      { return true; }

      ]]>
      </javascript>
      </validator>
      </pre>

      • @param bean The bean validation is being performed on.
      • @param va The <code>ValidatorAction</code> that is currently being
        performed.
      • @param field The <code>Field</code> object associated with the
        current field being validated.
      • @param errors The <code>ActionErrors</code> object to add errors to
        if any validation errors occur.
      • @param request Current request object.
      • @return True if smaller or equall, false otherwise.
        */
        public static boolean validateMaxFileSize(
        Object bean,
        ValidatorAction va,
        Field field,
        ActionErrors errors,
        HttpServletRequest request) {

      String fieldProperty = field.getProperty();

      String maxFileSizeStr = field.getVarValue("maxFileSize");
      int maxFileSize = 0;
      if (maxFileSizeStr.charAt(maxFileSizeStr.length() - 1) == 'B') {
      if (maxFileSizeStr.charAt(maxFileSizeStr.length() - 2)
      == 'K')

      { maxFileSize = Integer.parseInt( maxFileSizeStr.substring( 0, maxFileSizeStr.length () - 2)) * 1024; }

      else if (
      maxFileSizeStr.charAt(maxFileSizeStr.length() -
      2) == 'M')

      { maxFileSize = Integer.parseInt( maxFileSizeStr.substring( 0, maxFileSizeStr.length () - 2)) * 1048576; }

      else if (
      maxFileSizeStr.charAt(maxFileSizeStr.length() -
      2) == 'G')

      { maxFileSize = Integer.parseInt( maxFileSizeStr.substring( 0, maxFileSizeStr.length () - 2)) * 1073741824; }

      else

      { maxFileSize = Integer.parseInt( maxFileSizeStr.substring(0, maxFileSizeStr.length() - 1)); }

      }
      else

      { maxFileSize = Integer.parseInt(maxFileSizeStr); }

      FormFile file = (FormFile) getProperty(bean, fieldProperty);

      // check if (file != null) - there is no requirement that field
      is required.
      if (file != null && file.getFileSize() > maxFileSize)

      { errors.add( field.getKey(), Resources.getActionError(request, va, field)); return false; }

      return true;
      }

      /**

      • Return the property value from the page. It is naroving to have the
        ability to
      • return only java.lang.String like in <a
        href="http://jakarta.apache.org/commons/beanutils/api/org/apache/commons/beanuti
        ls/BeanUtils.html#getProperty(java.lang.Object,%20java.lang.String)">
      • http://jakarta.apache.org/commons/beanutils/api/org/apache/commons/beanutils/Bea
        nUtils.html#getProperty(java.lang.Object,%20java.lang.String)</a>

      • To have flexibility of handling in DynaForm more classes and be able
        to validate the input
      • we have to return java.lang.Object
      • @param bean
      • @param property
      • @param application
      • @return java.lang.Object
        */
        private static Object getProperty(Object bean, String property) {
        if (bean == null || property == null) { return null; }

      Class beanClass = bean.getClass();
      try {
      if (bean instanceof DynaBean)

      { return ((DynaBean) bean).get(property); }

      else

      { String methodName = new StringBuffer("get") .append(property.toUpperCase ().charAt(0)) .append(property.substring(1)) .toString(); Method method = beanClass.getMethod(methodName, null); return method.invoke(bean, null); }

      }
      catch (NoSuchMethodException e)

      { e.printStackTrace(); return null; }
      catch (IllegalArgumentException e) { e.printStackTrace(); return null; }

      catch (IllegalAccessException e)

      { e.printStackTrace(); return null; }
      catch (InvocationTargetException e) { e.printStackTrace(); return null; }

      }
      }
      </code>

      Attachments

        Issue Links

          Activity

            People

              Unassigned Unassigned
              jerzypuc@scdi.com Jerzy Puchala
              Votes:
              0 Vote for this issue
              Watchers:
              1 Start watching this issue

              Dates

                Created:
                Updated: