正常通过request来获取表单提交的数据时,是可以正常运行的。
但当含上传文件的标签(file)时,再通过request获取,则会导致空指针异常。
这里通过使用架包commons-fileupload中的DiskFileItemFactory方法对request进行转换,同时创建ServletFileUpload,利用List集合存储request。
上传文件所需的工具类
//生成文件名
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~15
int 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
//需要对resquest进行转换
DiskFileItemFactory df=new DiskFileItemFactory();
//ServletFiledUpload
ServletFileUpload 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();
}