使用带有空文件上传字段的雅加达流多部分请求时出现"Prefix too short"错误



我使用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及以上版本中修复。

最新更新