java使Wicket行为返回JSON结果,以便与jQuery FileUpload集成
为了将jQuery FileUpload集成到我的Wicket项目中,我注册了一个AbstractAjaxBehavior
并将其URL传递给文件输入组件,这样就可以将它传递给jQuery FileUpload。即,在文件上载面板的构造函数中:
AbstractAjaxBehavior fileUploadBehavior = new AbstractDefaultAjaxBehavior() {
@Override
protected synchronized void respond(AjaxRequestTarget target) {
// TODO Handle incoming file(s)...
}
};
WebMarkupContainer file = new WebMarkupContainer("file") {
@Override
protected void onComponentTag(ComponentTag tag) {
super.onComponentTag(tag);
IValueMap attributes = tag.getAttributes();
attributes.put("data-upload-url", fileUploadBehavior.getCallbackUrl());
}
};
add(file);
file.add(fileUploadBehavior);
问题是,我似乎无法阻止该行为返回状态302重定向到我的“stale page”错误页面
因此,问题是:如何防止这种重定向,而不是返回jQuery FileUpload期望的JSON响应
# 1 楼答案
可以通过调用
然后可以使用
上传的文件可通过以下方式访问:
其中
ServletFileUpload
来自apachecommons文件上载库YourFileItemImpl
是来自同一库的FileItem
接口的一些实现。这个类至少应该包含getName
、getSize
和getOutputStream
方法的适当实现(后者是执行持久化的方法)现在可以迭代
fileItems
列表,以构建要传递给response.write(...)
的适当响应总之,我们最终实现了以下行为:
您可能还希望捕获
fileuploaddone
事件,以便可以执行适当的UI更新(您不能再使用fileUploadBehavior
执行此操作,但您也只希望每个文件批执行一次UI更新):同步
respond
方法有两个目的:一次只接受一个(可能是多文件)上载。这可以防止单体面板最终接受多个文件的争用情况
确保在
respond
回调完成之前不处理fileuploaddone
事件,即使它在此之前已触发。虽然在实践中不应该发生这种情况,但jQuery FileUpload可能存在错误,这确保了针对这种情况(以及恶意用户)的健壮性最后,可以通过添加
相反,如果需要单文件上传,行为应该验证这一点