自从我将以下配置添加到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/>
答案 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);
这样,我可以取消网络:多部分过滤器配置,打破了其他请求。