Commons-FileUpload组件:
关键类:
ServletFileUpload类(实现文件上传操作。操作factory把提交上来的数据转化为FileItem)
常用方法:
1.Public List parseRequest(HttpServletRequest): 解析表单中的每一个字符数据,返回一个FileItem集合,把所有Http请求里的数据转化为FileItem对象
2.构造方法:ServletFileUpload(FileItemFactory Factory) :借助FileItemFactory,创建控制上传的核心类实例
3.setSizeMax(long sizeMax):设置请求信息实体内容的最大字节数,控制文件大小
4.public static final boolean isMultipartContent():判断请求中是否有附件,判断是否是mutipart/form-data
5.setHeaderEncoding(String encoding):设置转换时所使用的字符集编码
接口:
1.FileItemFactory接口:(工厂生产FileItem,原料是Http提交的请求) 实现类:DiskItemFactory
FileItemFactory factory = new DiskFileItemFactory();
2.FileItem:封装单个表单字段元素的数据,一个表单字段元素对应一个FileItem实例
FileItem常见方法:
isFormField():判断FileItem对象封装的数据类型,普通返回true,文件表单返回false
getName():获取的是文件上传字段中的文件名,只有type类型为file的才会被获取,若是普通表单字段获取不到会返回Null
getFieldName():获取普通表单的name属性值
write():将FileItem对象中保存的主体内容保存到指定文件中去
getString():把form表单的值都转为String类型
getSize():获取文件大小(字节数)
步骤:
1:准备环境:拷贝JAR包到lib文件夹下,fileupload,i/o
2:设置表单的enctype属性
<form enctype="multypart/form-data" method="post">
method必须为post,因为对于文件而言,没有办法被get请求转化为url附加上去
在表单中使用File控件选择文件<input type="file">
3:开始上传:
导入包:
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
3.1:创建FileItemFactory对象
3.2:创建ServletFileUpload对象(通过上面的对象,实例化ServletFileUpload对象)
解析form表单提交的所有表单元素数据
如果是普通表单元素
获取钙元素的名和值使用
如果是文件数据
获取文件名等参数
保存文件数据到服务器
示例代码(包含限制文件大小和格式):
<%@page import="java.io.File"%>
<%@ page language="java" import="java.util.*" pageEncoding="UTF-8"%>
<%@ page import="org.apache.commons.fileupload.*" %>
<%@ page import="org.apache.commons.fileupload.disk.DiskFileItemFactory" %>
<%@ page import="org.apache.commons.fileupload.servlet.ServletFileUpload" %>
<%
String path = request.getContextPath();
String basePath = request.getScheme()+"://"+request.getServerName()+":"+request.getServerPort()+path+"/";
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN">
<html>
<head>
<base href="<%=basePath%>">
<title>My JSP 'upload.jsp' starting page</title>
<meta http-equiv="pragma" content="no-cache">
<meta http-equiv="cache-control" content="no-cache">
<meta http-equiv="expires" content="0">
<meta http-equiv="keywords" content="keyword1,keyword2,keyword3">
<meta http-equiv="description" content="This is my page">
<!--
<link rel="stylesheet" type="text/css" href="styles.css">
-->
</head>
<body>
<%
//创建FileItem工厂
FileItemFactory factory = new DiskFileItemFactory();
ServletFileUpload upload = new ServletFileUpload(factory);
//判断是否是文件上传的表单
boolean isMultipart = ServletFileUpload.isMultipartContent(request);
//设置上传文件最大字节
upload.setSizeMax(30*1024*1000);//30KB
try{
if(isMultipart){
//获取FileItem集合
List<FileItem> items = upload.parseRequest(request);
System.out.print("size>>>>"+items.size());
for(FileItem item:items){
//确定是否是文件组件
boolean isFormField = item.isFormField();
if(isFormField){
//isFormField为true代表是普通表单
String name = item.getFieldName(); //得到表单字段name属性值
String value = item.getString("UTF-8"); //保存主体内容
System.out.print("name>>>>"+name+" value>>>>"+value);
}else{
//先设定路径
String savepath = application.getRealPath("upload");
String fileName = item.getName();
//通过Arrays类的asList()方法创建固定长度的集合
List<String> fileType = Arrays.asList("gif");
String ext = fileName.substring(fileName.lastIndexOf(".")+1);//拿到文件名小数点后面的内容
if(!fileType.contains("ext")){
out.print("上传失败,格式只能是GIF");
}else{
File file = new File(savepath+"/"+fileName);
item.write(file);//保存到指定文件中
}
}
}
}else{
out.print("非法文件上传");
}
}catch(FileUploadBase.FileSizeLimitExceededException e){
e.printStackTrace();
out.print("您上传的文件超出最大字节"+upload.getSizeMax()/1024+"kb");
}
%>
</body>
</html>