使用Wicket.ajax.post发布大量数据

时间:2014-08-27 15:02:46

标签: ajax post file-upload wicket

我尝试使用Behavior和JavaScript FileReader,可以在这个问题中看到:Wicket Drag and drop functionality for adding an image

如果我发帖超过200k,我收到错误Form too large。所以也许我错过了一些多部分的东西。

使用大量数据调用Wicket.ajax.post()的正确方法是什么?

我尝试将mp设置为true,但之后就开始抱怨我没有表单ID。它需要一个表格吗?

顺便说一下。我使用Jetty,但使用表单使用常规文件上传没有问题。

2 个答案:

答案 0 :(得分:1)

Jetty中的表单大小限制默认为200k。 在webapp / WEB-INF文件夹中添加jetty-web.xml。在那里,您可以设置所需大小的表单大小限制。

<?xml version="1.0"?>
  <!DOCTYPE Configure PUBLIC "-//Mort Bay Consulting//DTD Configure//EN"
  "http://jetty.mortbay.org/configure.dtd">

  <Configure id="WebAppContext" class="org.eclipse.jetty.webapp.WebAppContext">
          <Set name="maxFormContentSize" type="int">900000</Set>
          <Set name="maxFormKeys">5000</Set>
  </Configure>

答案 1 :(得分:1)

此错误来自jetty Request实施。

如果您查看Request#extractFormParameters方法的来源,您会看到下一个:

if (_context != null)
{
    maxFormContentSize = _context.getContextHandler().getMaxFormContentSize();
    maxFormKeys = _context.getContextHandler().getMaxFormKeys();
}

if (maxFormContentSize < 0)
{
   Object obj = _channel.getServer().getAttribute("org.eclipse.jetty.server.Request.maxFormContentSize");
   if (obj == null)
      maxFormContentSize = 200000;
   else if
      ...
}

因此,实际上,您可以将您的上下文值设置为pikand建议为0,或者按如下方式设置服务器配置:

<Configure id="Server" class="org.eclipse.jetty.server.Server">
    <Call name="setAttribute">
      <Arg>org.eclipse.jetty.server.Request.maxFormContentSize</Arg>
      <Arg>-1<!-- or 0, or any lt 0 --></Arg>
    </Call>
    ...
</Configure>

根据此代码,您的异常会稍后抛出:

if (contentLength > maxFormContentSize && maxFormContentSize > 0)
{
    throw new IllegalStateException("Form too large: " + contentLength + " > " + maxFormContentSize);
}

因此,您可以看到,maxFormContentSize可能<= 0不会抛出此异常。

我认为,没有必要通过ajax更新内容。但事实上,最好限制数据大小,而不是让用户放下你的服务器。

其他应用程序服务器有自己的设置,对于大多数应用程序服务器,您应将maxPostSize值设置为零,以禁用此限制。


此外,wicket Form组件拥有自己的maxSize属性,您可以使用Form#setMaxSize进行设置。问题是Form将此值作为Bytes值传输给FileUploadBase类,该类具有下一个javadoc:

  

完整请求允许的最大大小,而不是   fileSizeMax。值-1表示没有最大值。

实际上此参数是通过fileUpload.setSizeMax(maxSize.bytes());设置的,Bytes不能保留负值。但我认为您可以尝试将其设置为0并检查它是否有效。默认情况下,Form#getSizeMax()方法检查:

return getApplication().getApplicationSettings().getDefaultMaximumUploadSize();

返回Bytes.MAX,等于8388608 terabytes。我认为,这将是“无限制”的价值:)

另外,据我所知 - 您不需要设置表单ID,以允许使用multipart参数。只有通过ajax更新表单时,才必须设置Form.setOutputMarkupId(true)。但实际上,Form如果是多部分,则会在renderHead方法中自行创建id:

// register some metadata so we can later properly handle multipart ajax posts for
// embedded forms
registerJavaScriptNamespaces(response);
response
    .render(JavaScriptHeaderItem.forScript("Wicket.Forms[\"" + getMarkupId()
        + "\"]={multipart:true};", Form.class.getName() + '.' + getMarkupId()
        + ".metadata"));

注意,如果不存在,getMarkupId()方法会创建标记ID。