在jeecg中如果用了formvalid标签来生成表单代码的话,是不能同时提交附件的,比如最常用的html标签 input type="file"是不能用的,后台接收不到附件,具体原因是因为jeecg中都是用ajax的方式来提交表单并且不支持附件的处理,如果要在表单中同时提交附件,只能使用jeecg的upload标签,并且附件的提交和表单其它参数的提交实际上是分两步来处理的,具体实现过程如下:
-
在需要上传附件的地方增加upload标签:
<t:upload name="fiels" id="file_upload" extend="txt" buttonText="添加文件" multi="false" formData="taskId" uploader="smTaskController.do?importTxt">
</t:upload>
其中比较主要的属性是formData和uploader,formData属性是在上传附件是要一起提交的表单参数,一般是传业务表的主键,uploader属性是具体的处理附件的提交路径
2.在fomrvalid标签中增加callback属性
<t:formvalid formid="formobj" dialog="true" layout="table" action="smTaskController.do?save" callback="@Override uploadFile">
3. 在页面顶部head之间增加相应的处理代码:
<script type="text/javascript">
$(function(){
//查看模式情况下,删除和上传附件功能禁止使用
if(location.href.indexOf("load=detail")!=-1){
$(".jeecgDetail").hide();
}
});
function uploadFile(data){
$("#taskId").val(data.obj.id);
if($(".uploadify-queue-item").length>0){
upload();
}else{
frameElement.api.opener.reloadTable();
frameElement.api.close();
}
}
function close(){
frameElement.api.close();
}
</script>
其中最主要的就是uploadFile这个函数了,这边的主要逻揖就是获取业务表保存成功后返回的业务表的唯一标识设置在表单的隐藏属性当中,然后调用upload方法上传附件
4.最后在controller接收附件并处理,如下:
@RequestMapping(params = "importTxt", method = RequestMethod.POST)
@ResponseBody
public AjaxJson importTxt(HttpServletRequest request) {
AjaxJson j = new AjaxJson();
String taskId = request.getParameter("taskId");
MultipartHttpServletRequest multipartRequest = (MultipartHttpServletRequest)request;
Map<String, MultipartFile> fileMap = multipartRequest.getFileMap();
for (Map.Entry<String, MultipartFile> entity : fileMap.entrySet()) {
try {
this.smTaskService.saveFile(taskId, entity.getValue().getInputStream());
message = "短信任务添加成功";
} catch (IOException e1) {
e1.printStackTrace();
message = "短信任务添加失败";
} finally {
try {
entity.getValue().getInputStream().close();
} catch (IOException e) {
e.printStackTrace();
}
}
}
j.setMsg(message);
return j;
}
其中要把HttpServletRequest参数强制转化为MultipartHttpServletRequest类型后再获取文件流进行处理,用springmvc中的@RequestParam MultipartFile参数直接获取附件是获取不到的,具体原因不是太清楚。