问题1,你的class里面是不是有什么校验操作呢?
问题2,form的提交,如果你设置了onsubmit那么提交就走入到navTabSearch,而不是form的action请求了。那么你后台的Action就不可能直接收到这个文件表单。
首先确认一下,你是不是需要在form提交之前进行表单数据校验,并且提交操作不是走form的自动跳转,而是在navTabSearch中ajax请求完成上传呢?如果是这样的话,可以在Action中使用ServletFileUpload解析上传的文件。
示例代码:
public void execute(HttpServletRequest request, HttpServletResponse response){
ApplicationContext context = WebApplicationContextUtils.getWebApplicationContext(request.getSession().getServletContext());
//引入MaterialsService
MaterialsService materialsService = context.getBean(MaterialsService.class);
DiskFileItemFactory factory = new DiskFileItemFactory();
// 设置内存缓冲区,超过后写入临时文件
factory.setSizeThreshold(10240000);
// 设置文件上传路径,文件统一存储在视频文件夹下的Materials文件夹下
String basepath = SystemConfig.getVodFolder() + "/Materials/";
File file = new File(basepath);
if (!file.exists())
file.mkdirs();
factory.setRepository(file);
ServletFileUpload upload = new ServletFileUpload(factory);
// 设置单个文件的最大上传值
upload.setFileSizeMax(10002400000l);
// 设置整个request的最大值
upload.setSizeMax(10002400000l);
upload.setHeaderEncoding("UTF-8");
try {
List<?> items = upload.parseRequest(request);
FileItem item = null;
String filePath = null;
String fileName = null;
long fileSize = 0;
String flg = null;
for (int i = 0; i < items.size(); i++) {
item = (FileItem) items.get(i);
// 保存文件
if (!item.isFormField() && item.getName().length() > 0) {
fileName = item.getName();//真实文件名
fileSize = item.getSize();
flg = fileName.substring(fileName.lastIndexOf(".") + 1);//截取扩展名
//为防止文件重名,则将存储名称使用UUIDGenerator重置
String flgName = UUIDGenerator.geterateId() + "." + flg;
// fileName.substring(0, fileName.lastIndexOf(".")) + "_" + String.valueOf(System.currentTimeMillis()) + "." + flg;
filePath = basepath + flgName;
File uploadedFile = new File(filePath);
//写文件
item.write(uploadedFile);
//那么这个File uploadedFile就是客户端上传的文件了
}
}
} catch (Exception e) {
e.printStackTrace();
}
}
方法的参数的获取,可以网上搜一下struts2如何获取HttpServletRequest 和HttpServletResponse。依照你的需求,就是不能利用struts2完成请求表单数据的映射,只能自己解析HttpServletRequest中的表单数据了。