目录
1.获取Commons-FileUpload组件的步骤
- 下载Commons-FileUpload组件,即commons-fileupload-1.4-bin
- 下载Commons-IO组件,即ccommons-io-2.11.0-bin.zip,该组件用于处理文件上传所依赖的I/O操作
2.表单的属性设置
<form action="upload.jsp" enctype="multipart/form-data" method="post">
注意:上传文件时form标签的method属性值必须为“post”,不能为get
2.1表单enctype属性有以下三个属性值
值 | 描述 |
---|---|
application/x-www-form-urlencoded | 在发送前编码所有字符(默认) |
multipart/form-data | 不对字符编码。 在使用包含文件上传控件的表单时,必须使用该值。 |
text/plain | 空格转换为 "+" 加号,但不对特殊字符编码。 |
- 表单数据会编码为 "application/x-www-form-urlencoded"。就是说,在发送到服务器之前,所有字符都会进行编码(空格转换为 "+" 加号,特殊符号转换为 ASCII HEX 值)。
- application/x-www-form-urlencoded不是不能上传文件,是只能上传文本格式的文件,multipart/form-data是将文件以二进制的形式上传,这样可以实现多种类型的文件上传。
2.2 使用File控件选择文件
<form action="upload.jsp" enctype="multipart/form-data" method="post">
<p>选择文件:<input type="file" name="nfile" /></p>
<P><input type="submit" value="提交" />
</form>
3.Commons-FileUpload组件的API
在使用Commons-FileUpload组件之前,首先需要在项目中添加commons-fileupload-1.4.jar和commons-io-2.4.jar 文件。添加完jar文件之后,JSP文件中还需要将Commons-FileUpload组件所使用的类库导入JSP文件中
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
4.编写上传文件处理页的实现步骤
1.创建FileItemFactory对象
2.创建ServletFileUpload对象
3.解析form表单提交的所有表单元素数据
5.实现代码
<%@ page import="java.io.*,java.util.*"%>
<%@ page import="org.apache.commons.fileupload.*"%>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%
//这一句话只对文件名有效,对普通字段无效
request.setCharacterEncoding("utf-8");
//请求信息中的内容是否multipart类型,判断是否是一个文件上传的类型
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//上传文件的存储路径(服务器文件系统上的绝对文件路径)
String uploadFilePath = request.getSession().getServletContext().getRealPath("upload/");
if(isMultipart){
//是一个上传文件的请求才用upload组件,工场对象
FileItemFactory factory = new DiskFileItemFactory();
//创建ServletFileUpload对象
ServletFileUpload upload = new ServletFileUpload(factory);
try{
//关键步骤,解析form表单中所有文件,获得提交数据
List<FileItem> items = upload.parseRequest(request);
for(FileItem item : items){
//判断数据是普通字段还是文件字段
if(item.isFormField()){ //普通表单字段,isFormField(),普通表单字段返回true,反之返回false
//普通字段
System.out.println(item.getFieldName()+": "+item.getString("UTF-8"));
}else{ //文件表单字段
//文件字段
//获取文件名
String fileName = item.getName();
//项目发布的路径,application.getRealPath()得到虚拟目录对应的绝对路径
String uploadPath = application.getRealPath("/upload");
System.out.println(uploadPath);
//uploadPath父目录,fileName文件名
File outFile = new File(uploadPath,fileName);
//写入文件
item.write(outFile);
}
}
}catch(Exception e){
e.printStackTrace();
}
}
%>