我使用Struts 2.3.24.1,由于这里提到的错误而切换到jakarta-stream
实现后,我发现表单中的文件上传字段为空时出现了一个新错误。我的表格如下(节略):
<s:form enctype="multipart/form-data" method="POST" action="persistAddNote" id="noteForm">
<s:token/>
<s:file name="fileUpload" size="79"/>
<s:if test="hasActionErrors()">
<s:property value="%{#request.uploadError}" escape="false"/>
</s:if>
<s:submit cssClass="buttonFormat" value="Save"
onclick="javascript: disableButtons(); document.noteForm.submit();"/>
</s:form>
persistAddNote
动作配置如下:
<action name="persistAddNote" class="my.example.action.PersistNoteAction">
<param name="parameter">my.example.encoder.Latin1ToLatin9Encoder</param>
<interceptor-ref name="tokenSession"/>
<interceptor-ref name="fileUpload"/>
<interceptor-ref name="servletConfig"/>
<interceptor-ref name="staticParams"/>
<interceptor-ref name="actionMappingParams"/>
<interceptor-ref name="params"/>
<interceptor-ref name="validation">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<interceptor-ref name="workflow">
<param name="excludeMethods">input,back,cancel,browse</param>
</interceptor-ref>
<exception-mapping name="notes.error.filesize"
exception="my.example.exception.UploadFileSizeException"
result="/notes/error.jsp"/>
<result name="input">/notes/addnote.jsp</result>
<result name="added">/notes/newnoteok.jsp</result>
<result name="novalidaction">/notes/noValidActionError.jsp</result>
</action>
由于未设置文件名,JakartaStreamMultiPartRequest.createTemporaryFile(String, String)
方法中出现错误。这是意料之中的事,因为不需要文件上传字段。我试着调试Struts代码,但看起来multipart/form-data
enctype总是触发临时文件的创建。当我切换回struts.properties
中的标准jakarta
实现时,错误就消失了,但这又带来了我上面提到的问题。
有人知道如何解决这个问题吗?
在新版本发布之前,您可以应用简单的JavaScript解决方案来修复此问题。如果提交前文件输入字段为空,只需禁用该字段即可。
function checkFileInput() {
var fileInput = document.getElementById("fileInputId");
if (fileInput.value.length < 1) {
fileInput.disabled = true;
}
}
正如Aleksandr所提到的,这是JakartaStreamMultiPartRequest
中的一个错误(请参阅WW-4583)。该错误已在2.3.28及以上版本中修复。