2012-07-03 48 views
1

我有一個應用程序,可以讓你上傳一些照片。我有一個jsp頁面與表單選擇要上傳的照片是什麼:爲什麼jF中沒有顯示(正確)錯誤「file.too.large」?

蘇比爾-foto.jsp

... 
<s:form action="SubirFoto" method="post" enctype="multipart/form-data" theme="bootstrap"> 
    <s:file name="foto" label="Foto" /> 
    <s:submit value="Upload" align="center" /> 
</s:form> 
... 

我想,隨着這種形式下,用戶只能上傳特定類型的文件(如jpg,gif ...),並且不要讓用戶上傳大小超過2 MB的照片。

struts.xml的

<action 
     name="SubirFoto" 
     class="impl.redex.presentation.profile.upload.SubirFotosAction"> 
     <interceptor-ref name="fileUpload"> 
      <param name="maximumSize">2097152</param> 
      <param name="allowedTypes"> 
       image/png,image/gif,image/jpeg,image/pjpeg 
      </param> 
     </interceptor-ref> 
     <interceptor-ref name="dentroStack"></interceptor-ref> 
     <result name="success">/WEB-INF/jsps/foto/foto-subida.jsp</result> 
     <result name="input">/WEB-INF/jsps/foto/subir-foto.jsp</result> 
</action> 

的文件上傳的作品完美,除了一兩件事。如果滿足要求,我可以上傳任何照片。如果我嘗試上傳不是照片的文件(例如,純文本文件),應用程序會將我在global.properties中定義的錯誤輸入到jsp表單的輸入中。

global.properties

struts.messages.error.uploading - No se ha podido subir el fichero 
struts.messages.error.file.too.large - El fichero es demasiado grande. El tamaño máximo es de 2MB. 
struts.messages.error.content.type.not.allowed - Tipo de fichero no aceptado. Sólo es válido si la foto \ 
está en formato jpg/jpeg, gif o png. 

的問題就來了,如果我嘗試比2 MB上傳圖片越大,應用重定向我蘇比爾-foto.jsp,但它不把任何錯誤在jsp頁面中。

我已經嘗試了一下,如果我把<s:actionerror />蘇比爾-foto.jsp的時候我上傳的照片大就出現這樣的:

the request was rejected because its size (17224595) exceeds the configured maximum (2097152) 

正如你所看到的,這不是錯誤,我已在global.properties中定義。

爲什麼這兩個不同的錯誤現場錯誤?這是引導插件的問題嗎?或者它是Struts2的錯誤?難道我做錯了什麼?任何幫助表示讚賞,謝謝。

+0

是否將global.properties註冊爲自定義i18n資源?例如,在你的struts.xml(或struts.properties)中:''? –

+0

是的,我有我的struts.xml行'<常數 \t \t NAME = 「struts.custom.i18n.resources」 \t \t值= 「全球」/>' – Pigueiras

回答

5

我更多的搜索在谷歌,我發現,解釋該錯誤的博客(博客條目是從2008年,我使用Struts 2.3.4):

http://blog.bielu.com/2008/09/solution-to-struts2-upload-file-error.html

我總結一下我是如何解決我的問題。問題在於消息the request was rejected because its size ...在其中一個Struts2類中進行了硬編碼。

這個問題至少有三種解決方案(所有這些都是屁股疼痛):一種是重新實現org.apache.struts2.dispatcher.multipart.MultiPartRequest類;第二個是重新實現org.apache.struts2.interceptor.FileUploadInterceptor類。

第三個方法是在FileUpload類中放入一個validate方法。

@Override 
public void validate() { 
    boolean error = false; 

    Collection<?> tmp = getActionErrors(); 

    for (Object o : tmp) { 
     if (o.toString().contains(
       "the request was rejected because its size")) { 

      if (!error) { 
       addFieldError("foto", 
         "El tamaño de la foto es muy grande (Máximo: 2MB)"); 
       error = true; 
      } 
     } 
    } 

} 

無論如何,我仍然無法理解爲什麼我定義並沒有在我搜索的所有站點,因爲工作的消息告訴我覆蓋struts.messages.error.file.too.large爲什麼都是錯誤的不同類型的錯誤(場動作錯誤)。

感謝大家爲你的時間。

+0

+1 - 尼斯找到。沒有一種解決方案特別好。將異常消息作爲行爲錯誤傳遞的方法將導致國際化問題。 –

+0

https://issues.apache.org/jira/browse/WW-3177 –

0

首先,這個錯誤進入畫面,如果你想上傳的文件超過您對文件上傳用

有一個非常簡單的解決方案中指定的文件大小: 在你的struts.xml,增加文件上傳用的文件大小值,

<constant name="struts.multipart.maxSize" value="50777216000" /> 
    <param name="maximumSize">15728640</param> 

保持PARAM NAME =「MAXIMUMSIZE」值小於文件上傳用價值,
如在上述情況下,你會得到你自定義的錯誤defin編輯在global.properties,除非你超過struts.multipart.maxSize限制..所以嘗試保持struts.multipart.maxSize值到一定的高範圍。

相關問題