ENCTYPE ="多部分/格式数据"不使用Seam multipart-filter提交数据

时间:2015-12-28 13:09:09

标签: jsf file-upload seam jsf-1.2 seam2

自从我将以下配置添加到components.xml以自定义编辑器插件后,每个表单都使用enctype =" multipart / form-data"在我的应用程序中不提交数据。 我无法找到任何来源说这是冲突的。

    <web:multipart-filter create-temp-files="true"
                  max-request-size="1000000" 
                  url-pattern="*" />

我正在使用Seam 2.2.2和Jsf 1.2

更新:我以为我可以停止使用带有enctype =&#34; multipart / form-data&#34;的表单。但我不能。我需要一些帮助,有更多信息。

首先:上面的问题仅适用于a4j表单和a4j commandButtons。 正如我之前所说,我在components.xml中添加了上面的web:multipart-filter config,以使这个编辑器插件工作(这是通过apache commons ServletFileUpload完成的)。 我正在从项目表单中取出enctype配置以使一切正常,但有一种情况是不可能的。当我必须上传图像。但是当我使用url-pattern =&#34; *。seam&#34;:

<web:multipart-filter create-temp-files="true"
                  max-request-size="1000000" 
                  url-pattern="*.seam" />

然后上传工作,但ServletFileUpload没有。 如果我不使用任何网络:multipart-filter,也会发生这种情况。 (图片上传确定,插件失败)

现在是这样的:

<h:form id="editPhoto" enctype="multipart/form-data">   

        <div id="photoAttribute" class="attribute-relationship spacer-top-bottom">
            <div class="label">
                <h:outputText>#{messages['person.photo.alter']} </h:outputText>
            </div>
            <s:fileUpload id="photoPerson" 
                    data="#{person.profilePhoto}" 
                    fileName="#{person.profilePhotoName}" 
                    fileSize="#{person.profilePhotoSize}"
                    accept="images/*">
            </s:fileUpload>
        </div>

        <h:commandButton id="editPersonButtonTop" 
            value="#{messages['button.savePhoto']}" 
            action="#{personController.prepareSavePhoto(person)}" 
            styleClass="button btn-info"  
            onclick="showAjaxStatus()"/>
</h:form>

似乎我在这里缺少一些ajax配置,但我无法告诉它是什么。还有为什么我不能同时将ServletFileUpload和图像上传?

ServletFileUpload来自commons-fileupload-1.3.1,它的工作原理如下:

List<FileItem> items = new ServletFileUpload(new DiskFileItemFactory()).parseRequest(request);
processItems(items);
saveOpenAttachment();
...

private void processItems(List<FileItem> items)
{
    // Process the uploaded items
    Iterator<FileItem> iter = items.iterator();
    while (iter.hasNext()) {
        FileItem item = iter.next();

        if (!item.isFormField()) 
        {
            processUploadedFile(item);
        }
    }

}

private void processUploadedFile(FileItem item)
{
    setFileName(FilenameUtils.getName(item.getName()));
    try
    {
        InputStream fileContent = item.getInputStream();
        byte[] bytes = IOUtils.toByteArray(fileContent);
        setFileData(bytes);
    }
    catch (IOException e)
    {
        e.printStackTrace();
    }
    setFileContentType(item.getContentType());
}

我很感激,如果有人能告诉我如何使ServletFileUpload与之前的组件配置一起工作或如何让表单提交数据。

我的components.xml:

<core:init debug="true" jndi-pattern="@jndiPattern@"/>

<web:rewrite-filter view-mapping="*.seam"/> 

<web:multipart-filter create-temp-files="true"  
                  max-request-size="1024000" url-pattern="*.seam"/> 

<core:manager concurrent-request-timeout="10000" 
             conversation-timeout="3720000" 
             conversation-id-parameter="cid"
             parent-conversation-id-parameter="pid"
             default-flush-mode="MANUAL"/>

<persistence:managed-persistence-context name="entityManager"
                                 auto-create="true"
                  persistence-unit-jndi-name="java:/SinapseEntityManagerFactory"/>                          

<security:identity authenticate-method="#{authenticatorContext.authenticate}" remember-me="true" />

<international:time-zone-selector time-zone-id="GMT-3"/>
<international:locale-selector name="defaultLocale" locale-string="pt" scope="application" />
<international:locale-selector locale-string="pt" />

<event type="org.jboss.seam.security.notLoggedIn">
    <action execute="#{redirect.captureCurrentView}"/>
</event>
<event type="org.jboss.seam.security.postAuthenticate">
    <action execute="#{redirect.returnToCapturedView}"/>
</event>

<async:quartz-dispatcher/>  

<cache:jboss-cache-provider configuration="ehcache.xml" />
<transaction:ejb-transaction/>

2 个答案:

答案 0 :(得分:0)

只是一个幸运的猜测,添加

<web:multipart-filter create-temp-files="true" max-request-size="1000000" url-pattern="*.seam" />

Seam注册一个Multipart Filter并将所有请求包装为Seam MultipartRequest,我认为commons-fileupload无法处理它。

有关更多信息,请访问org.jboss.seam.web.MultipartFilter.java第78行

答案 1 :(得分:0)

为了解决我的问题,我更改了apache-commons FileUpload解决方案来处理Seam多部分过滤器所做的请求:

A = [1   NaN   2.2   3.2  4;
     NaN 7.9   5.1   NaN  5;
     3    5.5  NaN   4.1  NaN];
B = isnan(A);
A(B) = 0;
int_cols = all( round(A)==A, 1 );
A(B) = NaN;
it = A(:,int_cols);
flt = A(:,~int_cols);

这样,我可以取消网络:多部分过滤器配置,打破了其他请求。

相关问题