正常通过request来获取表单提交的数据时,是可以正常运行的。
但当含上传文件的标签(file)时,再通过request获取,则会导致空指针异常。
这里通过使用架包commons-fileupload中的DiskFileItemFactory方法对request进行转换,同时创建ServletFileUpload,利用List集合存储request。
上传文件所需的工具类
[code] //生成文件名public static String imgReName(String fileName){return UUID.randomUUID().toString().replaceAll(\"-\", \"\")+\"_\"+fileName;}public static String createNewUrl(String baseUrl,String fileName){//根据文件名生成路径//一级目录:WEB-INF/upload//二级目录:WEB-INF/upload/0~15//三级目录:WEB-INF/upload/0~15/0~15int hashCode=fileName.hashCode();//生成二级目录int path2=hashCode & 15;//生成三级目录int path3=(hashCode>>4) & 15;String newPath=baseUrl+\"\\\\\"+path2+\"\\\\\"+path3;File file=new File(newPath);//路径不存在 创建if(file.exists()==false){file.mkdirs();}return newPath;}
servlet
[code] //需要对resquest进行转换DiskFileItemFactory df=new DiskFileItemFactory();//ServletFiledUploadServletFileUpload sf=new ServletFileUpload(df);try {//表单提交得所有内容 进行获取List<FileItem> itemList=sf.parseRequest(request);for (FileItem fileItem : itemList) {//分为1.非file标签 2.file标签if(fileItem.isFormField()){//是普通的非file标签System.out.println(fileItem.getFieldName()+\"----\"+fileItem.getString());}else {//file标签//获取附件System.out.println(\"原名字\"+fileItem.getName());//获取文件新的名字String newName=UpLoadUtils.imgReName(fileItem.getName());//获取新路径String baseUrl=\"WEB-INF/upload\";//相对路径转换成物理路径baseUrl=request.getServletContext().getRealPath(baseUrl);String newPath=UpLoadUtils.createNewUrl(baseUrl, fileItem.getName());//上传//创建file对象File file=new File(newPath+\"\\\\\"+newName);fileItem.write(file);response.getWriter().print(\"success\");}}} catch (Exception e) {e.printStackTrace();}