我尝试使用Behavior
和JavaScript FileReader
,可以在这个问题中看到:Wicket Drag and drop functionality for adding an image
如果我发帖超过200k,我收到错误Form too large
。所以也许我错过了一些多部分的东西。
使用大量数据调用Wicket.ajax.post()
的正确方法是什么?
我尝试将mp
设置为true
,但之后就开始抱怨我没有表单ID。它需要一个表格吗?
顺便说一下。我使用Jetty,但使用表单使用常规文件上传没有问题。
答案 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。