将JakartaStreamMultiPartRequest与空文件上载字段一起使用时,“前缀太短”错误

时间:2016-01-06 09:06:35

标签: file-upload struts2

我正在使用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实施时,错误消失了,但这又带回了我上面提到的问题。

有没有人知道如何解决这个问题?

2 个答案:

答案 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;
    }
}