我正在使用Struts 2.3.24.1,并且由于提到here的错误而切换到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总是触发创建临时文件。当我切换回jakarta
中的标准struts.properties
实施时,错误消失了,但这又带回了我上面提到的问题。
有没有人知道如何解决这个问题?
答案 0 :(得分:1)
正如亚历山大提到的,这是JakartaStreamMultiPartRequest
中的一个错误(见WW-4583)。该错误已在2.3.28及更高版本中修复。
答案 1 :(得分:1)
在新版本发布之前,您可以将简单的JavaScript解决方法应用于修复此问题。如果在提交之前它是空的,只需禁用文件输入字段。
function checkFileInput() {
var fileInput = document.getElementById("fileInputId");
if (fileInput.value.length < 1) {
fileInput.disabled = true;
}
}