不管是Web开发,还是桌面端开发,文件上传这一功能都是常见的,在网站中几乎是必备的功能。在javaWeb中可以使用无组件实现文件上传,也可以使用组件实现文件上传。
组件实现文件的上传可以使用commons-fileUpload或jspsmartupload组件来实现文件的上传。
commons-fileUpload的使用
commons-fileUpload上传组件是apache的一个开源项目,使用这个组件不会出现中文乱码,而使用commons-fileUpload组件依赖commons-io包。ServletFileUpload类是该组件处理文件上传的主要类。
ServletFileUpload类常用方法如下
方法名 | 描述 |
public Long getFileSizeMax(Long fileSizeMax) | 获取FileItem对象文件大小的最大值. |
public void setFileSize(Long fileSizeMax) | 设置FileItem对象文件大小的最大值 |
piblic FileItemIteratorgetItemIterator(HttpServlet Request request) | 从请求中获取文件的迭代器 |
public boolean isMultipartContent(HttpServletRequest request) | 返回boolean值,用于判断请求是否为上传文件的请求,主要是判断form表单提交请求类型是否为multipart/form-data |
其中上面的setFileSizeMax(Long fileSizeMax)和getFileSizeMax()的FileItem对象为parseRequest()方法获取的List集合中的元素
commons-fileUpload使用的代码示例
首先先把需要的两个jar包导进项目中,如下
创建两个jsp页面,一个用于文件的上传,一个用于显示文件是否上传成功。
file.jsp(用于上传文件)关键代码如下:
相比以往表单不同的是要设置表单提交请求类型为multipart/form-data
<form method="post" action='<c:url value="/FileServlet"></c:url>' enctype="multipart/form-data">
<p>上传文件(注意:文件大小不要超过2MB)</p>
<br>
<input type="file" name="file" size="50"/><br>
文件描述<br>
<input type="submit" value="上传" size="30"/>
</form>
result.jsp(用于显示文件上传结果)关键代码如下:
在这里简单输出信息
<%=request.getAttribute("message") %>
FileServlet代码(文件上传请求的Servlet类)
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String message = null;
request.setCharacterEncoding("UTF-8");
File file = new File(path);
if(!file.exists()) {//判断文件是否存在,不存在就创建
file.mkdirs();
}
try {
//判断获取的是否是文件
if(ServletFileUpload.isMultipartContent(request)) {
//实例DiskFileItemFactory类
DiskFileItemFactory disk = new DiskFileItemFactory();
disk.setSizeThreshold(20*1024);//设置内存可存字节数
disk.setRepository(disk.getRepository());//设置临时文件目录
ServletFileUpload fupload = new ServletFileUpload(disk);
int maxSize = 2*1024*1024;
List list = fupload.parseRequest(request);//获取上传列表
Iterator it = list.iterator();//创建列表的迭代器
while(it.hasNext()) {
FileItem f = (FileItem) it.next();
if(!f.isFormField()) {
String filePath = f.getName();//获取文件全路径名
String fileName="";
int startIndex =filePath.lastIndexOf("\\");
if(startIndex!=-1) {
//对文件全路径进行截取
fileName=filePath.substring(startIndex+1);
}
else {
fileName=filePath;
}
if(f.getSize()>maxSize) {
message ="文件过大,不能超过2MB";
break;
} if(fileName==null||fileName.equals("")&&(f.getSize()==0)) {
message="文件不能为空,大小不能为0";
break;
}
//这里为了演示方便,将上传的文件输出到D盘下
File saveFile = new File("D:/is",fileName);
f.write(saveFile); //写入数据
message="文件上传成功";
}
}
}
} catch (Exception e) {
e.printStackTrace();
}
request.setAttribute("message", message); //保存信息到request域中
request.getRequestDispatcher("/jsp/result.jsp").forward(request, response);
}
运行结果
要注意的是使用commons-fileUpload组件进行表单处理时,因为将表单的enctype属性设置为multipart/form-data,所以在Servlet里使用request对象获取参数是无法获取的,需要使用ServletFileUpload类进行处理。
例
File.jsp关键代码(上传文件)
<center>
<%
String time;
Date date = new Date();
time = String.format("%tF", date);
%>
<form method="post" action='<c:url value="/FileServlet"></c:url>' enctype="multipart/form-data">
<h1>上传文件(注意:文件大小不要超过2MB)</h1>
<br>
选择上传文件
<input type="file" name="file" size="30"/><br><br>
备注
<input type="text" name="fileinfo" size="30"/><br><br>
上传时间
<input id="div1" type="text" value="<%=time %>" name="time" size="30" /><br><br>
<input type="submit" size="20" value="提交"/>
</form>
</center>
result.jsp代码 (显示结果,显示获取到的参数)
<body>
<%=request.getAttribute("message") %>
文件上传时间: <%=request.getAttribute("time") %>
文件备注: <%=request.getAttribute("remark") %>
</body>
servlet代码:
public void doPost(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
String message = null;//信息
String remark= null;//文件备注
String time = null;//上传时间
request.setCharacterEncoding("UTF-8");
String path = "D:/is";//定义上传文件的地址
try {
//判断从request传过来的是否是文件
if(ServletFileUpload.isMultipartContent(request)) {
DiskFileItemFactory dfi = new DiskFileItemFactory();
dfi.setSizeThreshold(20*1024);//设置内存的可存字节数
dfi.setRepository(dfi.getRepository());//设置临时文件目录
ServletFileUpload sf = new ServletFileUpload(dfi);
int maxsize = 2*1024*1024;
List list = sf.parseRequest(request);//获取上传列表
Iterator it = list.iterator();//创建上传列标的迭代器
while(it.hasNext()) {
FileItem fi = (FileItem) it.next();//遍历上传列表
if(!fi.isFormField()) {
String filePath = fi.getName();//获取文件全路径名
String fileName="";
int startIndex=filePath.lastIndexOf("\\");
if(startIndex!=-1) {
//截取文件名
fileName=filePath.substring(startIndex+1);
}else {
fileName=filePath;
}
if(fi.getSize()>maxsize) {
message="文件过大";
break;}
String fileSize = new Long(fi.getSize()).toString();
if((fileName==null)||(fileName.equals(""))&&(fileSize.equals("0"))){
message="文件不能为空和大小不能为0";
break; }
File saveFile = new File(path,fileName); //创建File类
fi.write(saveFile);//向文件写入数据
message="上传成功";
}
else {
String formName = fi.getFieldName();//获取表单元素名
String context = fi.getString("utf-8");//获取表单信息,注意编码
if(formName.equals("fileinfo")){
remark=context; //获取到参数值赋给成员变量
}else if(formName.equals("time")) {
time=context;
}}}
}
} catch (Exception e) {
}
request.setAttribute("time", time); //将获取到的信息保存到request域中
request.setAttribute("remark", remark);
request.setAttribute("message", message);
request.getRequestDispatcher("/jsp/result.jsp").forward(request, response);}
运行输出