文件上传,它是将一个表单转换成一个二进制的数 据流提交,所以不能够使request.getParameter形式获取参数。因此需要将表单转换成二进制表单。
添加依赖
<!-- 文件上传组件包 --><!-- https://mvnrepository.com/artifact/common s-fileupload/commons-fileupload --><dependency><groupId> commons- fileupload </groupId><artifactId> commons- fileupload </artifactId><version> 1.4 </version></dependency>
转换表单
在表单中,添加一个
enctype="multipart/form-data"设置表单为二进制表单。提交方式必须使用
post
形式。
- enctype 属性规定在将表单数据发送到服务器之前如何对其进行编码。
- multipart/form-data:将表单的数据处理为一条消息,以标签为单元,用分隔符分开。既可以上传键值对,也可以上传文件。
方法
//步骤1:创建FileItemFactory
FileItemFactory factory = new DiskFileItemFactory() ;
//步骤2:ServletFileUpload
ServletFileUpload fileUpload = new ServletFileUpload(factory) ;
//步骤3:设置对request进行解析
List<FileItem> fileItems = null;
try {
fileItems = fileUpload.parseRequest(req); //对request进行解析
} catch (FileUploadException e) {
e.printStackTrace(); 36
}
UserInfo userInfo = new UserInfo() ;
//步骤4:获取到所有的表单中的字段 FileItem
for (FileItem fileItem : fileItems) {
//步骤5:判断是否一个文件
if(fileItem.isFormField()) {
//getFieldNam:获取表单字段名字 getString:获取表单字段的值
System.out.println(fileItem.getFieldNam e() + ":" + fileItem.getString());
if("username".equals(fileItem.getFieldN ame())) {
userInfo.setUserName(fileItem.getString ());
}
}else{
//步骤6:将文件上传到对应的位置
//步骤6-1:文件上传的位置设定
String realFile = req.getServletContext().getRealPath("/upload");
//真实目录的对象
File realDir = new File(realFile) ;
//创建目录
if(!realDir.exists()) {
realDir.mkdirs() ;
}
//获取到文件的名字
String fileName = fileItem.getName() ;
//将文件名称一分为二,获取到文件的扩展名
String extName = fileName.substring(fileName.lastIndexOf( ".")) ;
//新文件名名称创建,避免有相同的文件名,造成文件覆盖
String newName = UUID.randomUUID().toString() + extName ;
//实现文件的上传
File uploadFile = new File(realFile,newName) ;
try {
fileItem.write(uploadFile);
} catch (Exception e) {
e.printStackTrace();
}
userInfo.setHeadphone("upload/" + newName);
}
}
}
}