7

我在嘗試在我的應用程序中配置Struts 2文件上傳攔截器時遇到了兩個問題。我想更改參數maximumSize(默認值爲2 MB,我需要它爲5 MB)和消息資源struts.messages.error.file.too.large(應用程序區域設置爲pt_BR,因此消息使用葡萄牙語而不是英語)。Struts 2文件上傳攔截器配置問題

該應用當前配置如下:

struts.properties

struts.locale=pt_BR 
struts.custom.i18n.resources=MessageResources 

struts.xml中

<package name="default" namespace="/" extends="struts-default"> 
    <interceptors> 
     <interceptor name="login" class="br.com.probank.interceptor.LoginInterceptor"/> 
     <interceptor-stack name="defaultLoginStack"> 
      <interceptor-ref name="login" /> 
      <interceptor-ref name="defaultStack"/> 
     </interceptor-stack> 
    </interceptors> 

    <default-interceptor-ref name="defaultLoginStack" /> 
    ... 
</package> 

... 
<package name="proposta" namespace="/proposta" extends="default"> 
    <action name="salvarAnexoProposta" method="salvarAnexoProposta" class="br.com.probank.action.AnexoPropostaAction"> 
     <interceptor-ref name="defaultLoginStack"> 
      <param name="fileUpload.maximumSize">5242880</param> 
     </interceptor-ref> 
     <result name="success">/jsp/listagemAnexosPropostaForm.jsp</result> 
     <result name="input">/jsp/crudAnexoPropostaForm.jsp</result> 
     <result name="error">/jsp/error.jsp</result> 
     <result name="redirect" type="redirect">${redirectLink}</result> 
    </action> 
</package> 

MessageResources.properties

... 
struts.messages.error.file.too.large=O tamanho do arquivo... 

我的Action實現和我的JSP代碼沒有什麼特別之處。他們按照找到的例子http://struts.apache.org/2.1.6/docs/file-upload-interceptor.html。當我嘗試上傳超過5 MB的文件時,應用程序會顯示消息「請求被拒絕,因爲它的大小(6229458)超過了配置的最大值(2097152)」 - 默認文件上傳消息的默認maximumSize值。

我嘗試將消息資源struts.messages.error.file.too.large放入struts-messages.properties中,但之後消息沒有更改。什麼是配置文件上傳攔截器的正確方法?我正在使用Struts 2 2.1.7。提前致謝。

+0

剛剛發現了一種更改上傳大小限制的方法。 :)我改變了'struts.multipart。'struts.properties'文件中的maxSize'屬性設置爲所需的值。但是,本地化錯誤信息的問題仍然存在...... – 2009-09-18 17:18:11

回答

9

終於解決了整個難題! struts.xmlMessageResource.properties已正確配置。問題是struts.multipart.maxSize。此值必須大於所需的上傳限制(我的應用中的5242880),因此我將其設置爲10000000.如果struts.multipart.maxSize的值等於或小於fileUpload.maximumSize,則Struts 2用於執行上載的庫將停止上載過程(以及在文件上傳攔截器有機會完成其工作之前寫入錯誤消息)。

6

您提供的解決方案並不完全正確,因爲如果我想要嚴格限制上傳限制以及國際化,這是行不通的。我也爲strut2創建了一個問題。請看下面的鏈接https://issues.apache.org/jira/browse/WW-3177。它將在struts2.1.9中修復,並已分配給struts團隊成員。

在兩者之間,我使用的是黑客。我瀏覽了struts2源代碼並找到了FileUploadInterceptor的代碼。使用該代碼,我創建了自己的代碼。以下是代碼。您可以在上面的鏈接中找到問題的詳細信息。希望這可以幫助。在你的操作文件

import java.io.File; 
import java.util.*; 

import javax.servlet.http.HttpServletRequest; 
import org.apache.struts2.ServletActionContext; 
import org.apache.struts2.dispatcher.multipart.MultiPartRequestWrapper; 
import com.opensymphony.xwork2.ActionContext; 
import com.opensymphony.xwork2.ActionInvocation; 
import com.opensymphony.xwork2.ActionProxy; 
import com.opensymphony.xwork2.ValidationAware; 
import com.opensymphony.xwork2.interceptor.AbstractInterceptor; 
import com.opensymphony.xwork2.util.LocalizedTextUtil; 
import com.opensymphony.xwork2.util.TextParseUtil; 
import com.opensymphony.xwork2.util.logging.Logger; 
import com.opensymphony.xwork2.util.logging.LoggerFactory; 


public class CustomFileUploaderInterceptor extends AbstractInterceptor { 

    private static final long serialVersionUID = -4764627478894962478L; 

    protected static final Logger LOG =   LoggerFactory.getLogger(CustomFileUploaderInterceptor.class); 
    private static final String DEFAULT_MESSAGE = "no.message.found"; 

    protected boolean useActionMessageBundle; 

    protected Long maximumSize; 
    protected Set<String> allowedTypesSet = Collections.emptySet(); 
    protected Set<String> allowedExtensionsSet = Collections.emptySet(); 

    public void setUseActionMessageBundle(String value) { 
     this.useActionMessageBundle = Boolean.valueOf(value); 
    } 

    /** 
    * Sets the allowed extensions 
    * 
    * @param allowedExtensions A comma-delimited list of extensions 
    */ 
    public void setAllowedExtensions(String allowedExtensions) { 
     allowedExtensionsSet = TextParseUtil.commaDelimitedStringToSet(allowedExtensions); 
    } 

    /** 
    * Sets the allowed mimetypes 
    * 
    * @param allowedTypes A comma-delimited list of types 
    */ 
    public void setAllowedTypes(String allowedTypes) { 
     allowedTypesSet = TextParseUtil.commaDelimitedStringToSet(allowedTypes); 
    } 

    /** 
    * Sets the maximum size of an uploaded file 
    * 
    * @param maximumSize The maximum size in bytes 
    */ 
    public void setMaximumSize(Long maximumSize) { 
     this.maximumSize = maximumSize; 
    } 

    /* (non-Javadoc) 
    * @see com.opensymphony.xwork2.interceptor.Interceptor#intercept(com.opensymphony.xwork2.ActionInvocation) 
    */ 
    public String intercept(ActionInvocation invocation) throws Exception { 
     ActionContext ac = invocation.getInvocationContext(); 
     Map<String, Object> params1 = ac.getParameters(); 
     Set<String> keySet = params1.keySet(); 
     for(String s : keySet){ 
      LOG.debug("Key: "+ s +", Value: " + params1.get(s).toString()); 
     } 
     HttpServletRequest request = (HttpServletRequest) ac.get(ServletActionContext.HTTP_REQUEST); 

     if (!(request instanceof MultiPartRequestWrapper)) { 
      if (LOG.isDebugEnabled()) { 
       ActionProxy proxy = invocation.getProxy(); 
       LOG.debug(getTextMessage("struts.messages.bypass.request", new Object[]{proxy.getNamespace(), proxy.getActionName()}, ac.getLocale())); 
      } 

      return invocation.invoke(); 
     } 

     ValidationAware validation = null; 

     Object action = invocation.getAction(); 

     if (action instanceof ValidationAware) { 
      validation = (ValidationAware) action; 
     } 

     MultiPartRequestWrapper multiWrapper = (MultiPartRequestWrapper) request; 

     if (multiWrapper.hasErrors()) { 
      String inputName = null; 
      if(multiWrapper.getFileParameterNames().hasMoreElements()){ 
       inputName = (String)multiWrapper.getFileParameterNames().nextElement(); 

      } 
      for (String error : multiWrapper.getErrors()) { 
       if (validation != null) { 
        Object[] args = new Object[]{inputName}; 
        validation.addActionError(getTextMessage(action, "struts.messages.error.file.too.large", args, ac.getLocale())); 
       } 
       LOG.error(error); 
      } 
     } 

     // bind allowed Files 
     Enumeration fileParameterNames = multiWrapper.getFileParameterNames(); 
     while (fileParameterNames != null && fileParameterNames.hasMoreElements()) { 
      // get the value of this input tag 
      String inputName = (String) fileParameterNames.nextElement(); 

      // get the content type 
      String[] contentType = multiWrapper.getContentTypes(inputName); 

      if (isNonEmpty(contentType)) { 
       // get the name of the file from the input tag 
       String[] fileName = multiWrapper.getFileNames(inputName); 

       if (isNonEmpty(fileName)) { 
        // get a File object for the uploaded File 
        File[] files = multiWrapper.getFiles(inputName); 
        if (files != null && files.length > 0) { 
         List<File> acceptedFiles = new ArrayList<File>(files.length); 
         List<String> acceptedContentTypes = new ArrayList<String>(files.length); 
         List<String> acceptedFileNames = new ArrayList<String>(files.length); 
         String contentTypeName = inputName + "ContentType"; 
         String fileNameName = inputName + "FileName"; 

         for (int index = 0; index < files.length; index++) { 
          if (acceptFile(action, files[index], fileName[index], contentType[index], inputName, validation, ac.getLocale())) { 
           acceptedFiles.add(files[index]); 
           acceptedContentTypes.add(contentType[index]); 
           acceptedFileNames.add(fileName[index]); 
          } 
         } 

         if (!acceptedFiles.isEmpty()) { 
          Map<String, Object> params = ac.getParameters(); 

          params.put(inputName, acceptedFiles.toArray(new File[acceptedFiles.size()])); 
          params.put(contentTypeName, acceptedContentTypes.toArray(new String[acceptedContentTypes.size()])); 
          params.put(fileNameName, acceptedFileNames.toArray(new String[acceptedFileNames.size()])); 
         } 
        } 
       } else { 
        LOG.error(getTextMessage(action, "struts.messages.invalid.file", new Object[]{inputName}, ac.getLocale())); 
       } 
      } else { 
       LOG.error(getTextMessage(action, "struts.messages.invalid.content.type", new Object[]{inputName}, ac.getLocale())); 
      } 
     } 

     // invoke action 
     String result = invocation.invoke(); 

     // cleanup 
     fileParameterNames = multiWrapper.getFileParameterNames(); 
     while (fileParameterNames != null && fileParameterNames.hasMoreElements()) { 
      String inputValue = (String) fileParameterNames.nextElement(); 
      File[] files = multiWrapper.getFiles(inputValue); 

      for (File currentFile : files) { 
       if (LOG.isInfoEnabled()) { 
        LOG.info(getTextMessage(action, "struts.messages.removing.file", new Object[]{inputValue, currentFile}, ac.getLocale())); 
       } 

       if ((currentFile != null) && currentFile.isFile()) { 
        currentFile.delete(); 
       } 
      } 
     } 

     return result; 
    } 

    /** 
    * Override for added functionality. Checks if the proposed file is acceptable based on contentType and size. 
    * 
    * @param action  - uploading action for message retrieval. 
    * @param file  - proposed upload file. 
    * @param contentType - contentType of the file. 
    * @param inputName - inputName of the file. 
    * @param validation - Non-null ValidationAware if the action implements ValidationAware, allowing for better 
    *     logging. 
    * @param locale 
    * @return true if the proposed file is acceptable by contentType and size. 
    */ 
    protected boolean acceptFile(Object action, File file, String filename, String contentType, String inputName, ValidationAware validation, Locale locale) { 
     boolean fileIsAcceptable = false; 

     // If it's null the upload failed 
     if (file == null) { 
      String errMsg = getTextMessage(action, "struts.messages.error.uploading", new Object[]{inputName}, locale); 
      if (validation != null) { 
       validation.addFieldError(inputName, errMsg); 
      } 

      LOG.error(errMsg); 
     } else if (maximumSize != null && maximumSize < file.length()) { 
      String errMsg = getTextMessage(action, "struts.messages.error.file.too.large", new Object[]{inputName, filename, file.getName(), "" + file.length()}, locale); 
      if (validation != null) { 
       validation.addFieldError(inputName, errMsg); 
      } 

      LOG.error(errMsg); 
     } else if ((!allowedTypesSet.isEmpty()) && (!containsItem(allowedTypesSet, contentType))) { 
      String errMsg = getTextMessage(action, "struts.messages.error.content.type.not.allowed", new Object[]{inputName, filename, file.getName(), contentType}, locale); 
      if (validation != null) { 
       validation.addFieldError(inputName, errMsg); 
      } 

      LOG.error(errMsg); 
     } else if ((! allowedExtensionsSet.isEmpty()) && (!hasAllowedExtension(allowedExtensionsSet, filename))) { 
      String errMsg = getTextMessage(action, "struts.messages.error.file.extension.not.allowed", new Object[]{inputName, filename, file.getName(), contentType}, locale); 
      if (validation != null) { 
       validation.addFieldError(inputName, errMsg); 
      } 

      LOG.error(errMsg); 
     } else { 
      fileIsAcceptable = true; 
     } 

     return fileIsAcceptable; 
    } 

    /** 
    * @param extensionCollection - Collection of extensions (all lowercase). 
    * @param filename   - filename to check. 
    * @return true if the filename has an allowed extension, false otherwise. 
    */ 
    private static boolean hasAllowedExtension(Collection<String> extensionCollection, String filename) { 
     if (filename == null) { 
      return false; 
     } 

     String lowercaseFilename = filename.toLowerCase(); 
     for (String extension : extensionCollection) { 
      if (lowercaseFilename.endsWith(extension)) { 
       return true; 
      } 
     } 

     return false; 
    } 

    /** 
    * @param itemCollection - Collection of string items (all lowercase). 
    * @param item   - Item to search for. 
    * @return true if itemCollection contains the item, false otherwise. 
    */ 
    private static boolean containsItem(Collection<String> itemCollection, String item) { 
     return itemCollection.contains(item.toLowerCase()); 
    } 

    private static boolean isNonEmpty(Object[] objArray) { 
     boolean result = false; 
     for (int index = 0; index < objArray.length && !result; index++) { 
      if (objArray[index] != null) { 
       result = true; 
      } 
     } 
     return result; 
    } 

    private String getTextMessage(String messageKey, Object[] args, Locale locale) { 
     return getTextMessage(null, messageKey, args, locale); 
    } 

    private String getTextMessage(Object action, String messageKey, Object[] args, Locale locale) { 
     if (args == null || args.length == 0) { 
      if (action != null && useActionMessageBundle) { 
       return LocalizedTextUtil.findText(action.getClass(), messageKey, locale); 
      } 
      return LocalizedTextUtil.findText(this.getClass(), messageKey, locale);       
     } else { 
      if (action != null && useActionMessageBundle) { 
       return LocalizedTextUtil.findText(action.getClass(), messageKey, locale, DEFAULT_MESSAGE, args); 
      } 
      return LocalizedTextUtil.findText(this.getClass(), messageKey, locale, DEFAULT_MESSAGE, args); 
     } 
    } 
} 
0

首先使用validate方法........

public void validate(){ 

    if(getFileUpload() !=null){ 

    System.out.println("======File size validation before upload: size in bytes: "+getFileUpload().length()); 

    if(getFileUpload().length()>202400){ 

//Give the size in bytes whatever you want to take 

    addActionError("File is too large ! Select less than 200Kb file"); 

     }else{ 

    addActionMessage("File Uploaded successfully!"); 

    } 
    } 
} 

有關完整代碼,請訪問:http://knowledge-serve.blogspot.com/2011/10/upload-file-using-in-struts-2.html

3

struts.xml試試這個,其中xxxxxxxx是極限:

<constant name="struts.multipart.maxSize" value="xxxxxxxxx" />