使用Apache文件上传组件的主要步骤:
(1) 确定上传的文件的存放路径,调用:
getServletContext().getRealPath("/path");
path可以是不存在地目录,用上述函数获得其真实路径后再调用File类的mkdir()方法创建目录。
(2) 使用DiskFileItemFactory类的实例对象
1.调用:setSizeThreshold(int sizeThreshold)方法设置是否使用临时文件夹及使用的临界值(即超过sizeThreshold时使用)。
2.调用:setRepository(String path)方法设置临时文件的存放目录。
(3) 使用ServletFileUpload类的实例对象
1.调用:setSizeMax(long sizeMax)方法设置请求消息实体内容的最大允许值。
2.调用:setHeaderEncoding(String encoding)方法设置上传的普通字段的名称和文件字段的文件名所使用的字符集编码。
3.调用:paseRequest(HttpServletRequest req)方法解析得到所有表单字段的对象的集合(List类)。
(4) 使用FileItem类,逐个取出上一步骤解析出的每个表单字段,转换为
FileItem类型。
1.调用isFormField()方法判断FileItem对象封装的是一个普通表单字段还是文件表单字段。
2.处理普通表单字段,可以调用getString(String encoding)返回指定编码的FileItem对象的主体内容。
3.可以调用getFieldName()返回表单字段元素的name属性值。
4.处理文件字段,可以调用getName()方法返回文件名。
5.调用write(File file)方法将FileItem对象保存的主体内容保存到指定的文件中。
6.调用delete()方法清空FileItem类对象中存放的主题内容,如果主题内容被保存在临时文件夹中,delete() 方法将删除该临时文件夹。
例子程序:
import java.io.*;
import java.util.*;
import javax.servlet.*;
import javax.servlet.http.*;
import org.apache.commons.fileupload.disk.DiskFileItemFactory;
import org.apache.commons.fileupload.servlet.ServletFileUpload;
import org.apache.commons.fileupload.FileUploadException;
import org.apache.commons.fileupload.*;
public class UploadServlet extends HttpServlet
{
public void doPost(HttpServletRequest request,
HttpServletResponse response)
throws IOException, ServletException
{
response.setContentType("text/html;charset=gb2312");
PrintWriter out=response.getWriter();
//设置保存上传文件的目录
String uploadDir=getServletContext().getRealPath("/upload");
System.out.println(uploadDir);
if(uploadDir==null)
{
out.println("无法访问存储目录");
System.out.println("无法访问存储目录");
return;
}
File fUploadDir=new File(uploadDir);
if(!fUploadDir.exists())
{
if(!fUploadDir.mkdir())
{
out.println("无法创建目录");
System.out.println("无法创建目录");
return;
}
}
if(!ServletFileUpload.isMultipartContent(request))
{
out.println("只能处理multipart/form-data类型数据");
System.out.println("只能处理multipart/form-data类型数据");
return;
}
DiskFileItemFactory dfif=new DiskFileItemFactory();
ServletFileUpload sfu=new ServletFileUpload(dfif);
//设置使用临时文件缓存及其临界值,此处为超过1M时使用
dfif.setSizeThreshold(1024*1024);
//设置临时文件的存放位置,忽略此语句时采用默认路径
File path=new File("D:\\apache-tomcat\\webapps\\fileupload\\temp");
dfif.setRepository(path);
//设置请求消息实体内容的最大允许大小,此处设置为2M
sfu.setSizeMax(1024*1024*2);
//设置上传的普通字段的内容和文件字段的文件名所采用的字符集编码
sfu.setHeaderEncoding("gb2312");
//从HTTP请求消息中解析所有表单字段对象的集合
List fileItems=null;
try
{
fileItems=sfu.parseRequest(request);
}
catch(FileUploadException e)
{
out.println("解析数据时出现如下问题:");
System.out.println("解析数据时出现如下问题:");
e.printStackTrace(out);
return;
}
//处理每个表单字段
Iterator i=fileItems.iterator();
while(i.hasNext())
{
FileItem fi=(FileItem)i.next();
//处理普通字段
if(fi.isFormField())
{
String content=fi.getString("gb2312");
String fieldName=fi.getFieldName();
request.setAttribute(fieldName,content);
}
//处理文件字段
else
{
try
{
String pathSrc=fi.getName();
//如果用户没有选择上传的文件,忽略处理
if(pathSrc.trim().equals(""))
{
continue;
}
//处理用户上传的文件
int start=pathSrc.lastIndexOf('\\');
String fileName=pathSrc.substring(start+1);
File pathDest=new File(uploadDir,fileName);
fi.write(pathDest);
String fieldName=fi.getFieldName();
request.setAttribute(fieldName,fileName);
}
catch(Exception e)
{
out.println("存储文件时出现如下问题:");
e.printStackTrace(out);
return;
}
finally
{
fi.delete();
}
}
}
//显示处理结果
out.println("用户:"+request.getAttribute("author")+"<br>");
out.println("来自:"+request.getAttribute("company")+"<br>");
StringBuffer filelist=new StringBuffer();
String file1=(String)request.getAttribute("file1");
makeUpList(filelist,file1);
String file2=(String)request.getAttribute("file2");
makeUpList(filelist,file2);
out.println("成功上传文件:"+(filelist.length()==0?"无":filelist.toString()));
}
private void makeUpList(StringBuffer result,String fragment)
{
if(fragment!=null)
{
if(result.length()!=0)
{
result.append(",");
}
result.append(fragment);
}
}
}