目录
一、导入jar包
二、转换表单
三、实现文件上传
四、FileItem对象的常用方法
五、FileUpload
一、导入jar包
导入jar包commons-io-2.2.jar和commons-fileupload-1.4.jar两个包 可以从官网直接下
二、转换表单
在表单中,添加一个enctype="multipart/form-data"设置。提交方式必须使用post形式
使用encrype设置为二进制表单
前端测试代码
<form action="tupian.do" method="post" enctype="multipart/form-data">
<input type="file" name="photo">
<input type="text" name="uname">
<input type="submit" value="提交">
</form>
三、实现文件上传
工具类可以直接调用,注意需要修改request.getServletContext().getRealPath("/");路径为自己保存的路径
使用FileUpload实现数据的上传的步骤
步骤一:创建FileItemFactory
步骤二:ServletFileUpload
步骤三:设置对request进行解析ServletFileUoload.parseRequest
步骤四;获取到所有表单中的字段FileItem
步骤五:判断是否是一个文件
步骤六:将文件上传到对应位置
代码如下
package controller;
import domain.UserInfo;
import org.apache.commons.fileupload.FileItem;
import org.apache.commons.fileupload.FileItemFactory;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.File;
import java.io.IOException;
import java.io.UnsupportedEncodingException;
import java.util.List;
import java.util.UUID;
public class RegistController extends HttpServlet {
protected void doPost(HttpServletRequest req, HttpServletResponse reap) throws IOException {
FileItemFactory factory=new DiskFileItemFactory();
ServletFileUpload fileUpload=new ServletFileUpload(factory);
List<FileItem> fileItems=null;
try {
fileItems=fileUpload.parseRequest(req);
} catch (FileUploadException e) {
throw new RuntimeException(e);
}
UserInfo userInfo=new UserInfo();
for(FileItem fileItem:fileItems){
if(fileItem.isFormField()){
if("username".equals(fileItem.getFieldName())){
userInfo.setLoginName(fileItem.getString("utf-8"));
}else if("password".equals(fileItem.getFieldName())){
userInfo.setPassword(fileItem.getString());
}else if("email".equals(fileItem.getFieldName())){
userInfo.setEmail(fileItem.getString());
}else {
userInfo.setMobile(fileItem.getString());
}
}else{
String realFile=req.getServletContext().getRealPath("/upload/headphone");
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) {
throw new RuntimeException(e);
}
userInfo.setHeadphone("upload/headphone"+newName);
reap.sendRedirect("/login.jsp");
}
}
}
}
四、FileItem对象的常用方法
System.out.println(fileItem.getFiledName());//获取表单传输的name
System.out.println(fileItem.getName()); //只有是上传文件内容时,才能够获取到文件名称
System.out.println(fileItem.getSize());//获取到文件大小
System.out.println(fileItem.getString());//获取到当前FileItem对应值
System.out.prinln(fileItem.getContentType());//是上传文件内容时,才能获取到文件类型
System.out.prinln(fileItem.isFormField());//如果是普通字段,该值就是true,否则就是false
五、FileUpload
enctype为表单提交时所采取的传输编码方式,默认为application/x-www-form-urlencode,在默认情况下对于上传的文件只能获取一个文件名。为了能够传输文件内容就需要采用multipart/form-data,此时提交表单后请求体中会对文件进行解析,若为其他属性直接获取它的值,不同的属性会以分割线分割.
核心类:
DiskFileItemFactory:磁盘文件项工厂,是文件上传的核心类,其他操作都依靠该对象进行
ServletFileUpload:服务解析类,用于解析Servlet服务中的request请求,可以调用该类的方法parseRequest(HttpServletRequest request)解析请求中的参数,返回一个List集合类型为FileItem
FileItem:请求参数的实体类,用于存放参数。可以调用getString(String encoding)方法获取普通属性的值,getName()获取属性的名称。对于文件参数可以通过isFormField()方法判断,返回为true为普通属性,false为文件属性。FileItem类提供了获取文件输入流的方法getInputStream()用于文件IO操作。
构造方法
1) public DiskFileItemFactory()
采用默认临界值和系统临时文件夹构造文件项工厂对象。
2) public DiskFileItemFactory(int sizeThreshold,File repository)
采用参数指定临界值和系统临时文件夹构造文件项工厂对象。
3) FileItem createItem()
根据DiskFileItemFactory相关配置将每一个请求消息实体项目创建成DiskFileItem 实例,并返回。该方法从来不需要我们亲自调用,FileUpload组件在解析请求时内部使用。