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



我正在尝试使用Behavior和JavaScript FileReader,如本问题所示:用于添加图像的Wicket拖放功能

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

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

我尝试将mp设置为true,但它开始抱怨我没有表单id。它需要表单吗?

Btw。我使用Jetty,但使用表单上传常规文件没有问题。

此错误来自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:

完整请求允许的最大大小,与文件大小最大值。值为-1表示没有最大值。

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

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

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

另外,正如我所知,您不需要设置Form 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。

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>

最新更新