我正在尝试使用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>