fileUpload控件使用方法介绍(有试例源代码哦!)

使用FileUpLoad包进行文件上传。
进行文件上传一般有三种方式
使用fileUpLoad
使用smartFileUpLoad
自己编写类似的程序进行解析
下面介绍一下第一种方式的使用方法:
fileUpLoad是apache的一个开源项目,用来进行解析带有文件的请求处理。著名的struts的FormFile就是用的它进行解析处理的。
1首先页面上我们需要将表单设置下面类似的参数:
< form method="post" enctype="multipart/form-data" action=”………… ” >
2 然后我们需要在工程里导入所需要的包,可以在apache网站上下载:
3 在我们的servlet中可以获取到request参数,然后可以这样取传递过来的字段参数及文件参数:
在这里我写了两个类去生成并存储字段和文件的值:
可以跟着红色的注释代码看一下实现的过程
/**
* @author sxy
*
* 封装了FileUpload类,实现文件上传功能
*
*/
public class FileUploadUtil {
private static Logger logger = Logger.getLogger(FileUploadUtil. class );
public HttpServletRequest request ;
// 这个是FileUpLoad控件的实际处理的request数据的类对象
DiskFileUpload fu ;
// 用来存储解析后的字段和文件数据
List fileItems ;
// 字段名与字段值的映射 String--Vector
HashMap fieldsMap = new HashMap();
// 字段名与相对UploadedFile的映射
HashMap filesMap = new HashMap();
/** 构造函数,遍历所有字段,分别存入文件MAP和字段MAP
* @param request
* @param tempDirectory
* @throws BaseWebException
*/
// 当生成一个类时就开始了对request传递过来的数据的解析
public FileUploadUtil(HttpServletRequest request,String tempDirectory) throws Exception {
this . request = request;
// 这一句很重要,以前我没有加上,结果UTF-8编码时老是出现乱码问题,最后还是看了Struts的文件上传源代码是这样写的,才解决了乱码问题
String encoding=request.getCharacterEncoding();
fu = new DiskFileUpload();
fu .setSizeMax(44194304); // 设置文件大小.
fu .setSizeThreshold(4096);
fu .setHeaderEncoding(encoding);
fu .setRepositoryPath(tempDirectory); // 设置临时目录.
try {
// 解析参数,在后面进行文件字段和普通字段值的进一步处理
fileItems = fu .parseRequest(request); // 解析请求,返回一个集合.
}
catch (FileUploadException e) {
throw new Exception(e);
}
Iterator i = fileItems .iterator();
// 遍历解析好的参数,以区分文件还是普通字段,并作相应的处理(存入不同的hashMap)
while (i.hasNext())
{
FileItem fi = (FileItem)i.next();
// 判断当前项是否为普通字段
if (fi.isFormField()) // 这是用来确定是否为文件属性,
{
Vector vec= new Vector();
// 需改正
String fieldName = fi.getFieldName(); // 这里取得字段名称
// 如果已经存在此字段信息(多选列表或多个同名的隐藏域等)
if ( fieldsMap .get(fieldName)!= null )
{
vec=(Vector) fieldsMap .get(fieldName);
logger .info( "value: fi.getString(request.getCharacterEncoding()));
// 很重要!需要进行编码哦!!!
vec.add(fi.getString(request.getCharacterEncoding()));
}
// 第一次取到这个名的字段
else
{
logger .info( "value: " +fi.getString(request.getCharacterEncoding()));
vec.add(fi.getString(request.getCharacterEncoding()));
fieldsMap .put(fieldName,vec);
}
}
// 为文件字段时
else
{
// 传来的文件名不为空时
String fullName=fi.getName();
if (fullName!= null &&!( "" .equals(fullName)))
{
// 这里是一个封装好的类型,封装的不太好,其中的getRealName()不//好用,但是获取扩展名和文件名的方法还是可以的。
UploadedFile uploadedFile= new UploadedFile(fi);
filesMap .put(fi.getFieldName(),uploadedFile);
}
}
}
} // FileUploadUtil
/**
* 模仿request的getParameter方法,取得非文件的字段
* 如果为多个值的,只返回第一个
* @param param
* @return 为空或键值不存在返回 null
*/
public String getParameter(String param)
{
if (param== null )
{
return null ;
}
else
{
Vector vec=(Vector) fieldsMap .get(param);
if (vec!= null &&vec.size()>0)
{
return (String)vec.get(0);
}
else return null ;
}
} //getParameter
public String[] getParameterValues(String param)
{
String[] values= null ;
if (param== null )
{
return null ;
}
else
{
Vector vec=(Vector) this . fieldsMap .get(param);
int size=vec.size();
values= new String[size];
if (vec!= null &&vec.size()>0)
{
for ( int i=0;i<size;i++)
{
values[i]=(String)vec.get(i);
}
return values;
}
else
{
return null ;
}
} //else
}
/**
*
* 返回上传的文件的名称,如若没这个参数名,返回null
* @param paramName
* @return
*/
public String getFileName(String paramName)
{
if (paramName!= null )
{
UploadedFile uploadedFile=(UploadedFile) this . filesMap .get(paramName);
if (uploadedFile!= null )
{
return uploadedFile.getRealName();
}
}
return null ;
}
/**
* 这个方法用来将文件字段保存在硬盘上。
* @param paramName
* @param newNameWithoutExt
* @param relativePath
* @throws BaseWebException
*/
public void upLoadFile(String paramName,String newNameWithoutExt,String relativePath) throws Exception
{
if (paramName!= null )
{
UploadedFile uploadedFile=(UploadedFile) this . filesMap .get(paramName);
if (uploadedFile!= null &&uploadedFile. fileItem .getSize()>0)
{
String path= request .getSession().getServletContext().getRealPath( "/" );
path+=relativePath+newNameWithoutExt;
uploadedFile.write(path);
}
}
}
public static void main(String[] args)
{
}
public List getFileItems() {
return fileItems ;
}
public void setFileItems(List fileItems) {
this . fileItems = fileItems;
}
public HashMap getFieldsMap() {
return fieldsMap ;
}
public void setFieldsMap(HashMap fieldsMap) {
this . fieldsMap = fieldsMap;
}
public HashMap getFilesMap() {
return filesMap ;
}
public void setFilesMap(HashMap filesMap) {
this . filesMap = filesMap;
}
public DiskFileUpload getFu() {
return fu ;
}
public void setFu(DiskFileUpload fu) {
this . fu = fu;
}
public HttpServletRequest getRequest() {
return request ;
}
public void setRequest(HttpServletRequest request) {
this . request = request;
}
}
// 辅助的文件封装字段,还很不完善,比如缺少获取文件流的方法,以后考虑创建 adapter
// 来实现封装对象 fileItem 的一些方法。这里主要提供了获取扩展名和文件名的方法,比较 // 简陋
public class UploadedFile {
private String fullName = "" ;
public FileItem fileItem ;
/**
* @param fileItem
*/
public UploadedFile(FileItem fileItem) {
this . fileItem = fileItem;
fullName =fileItem.getName();
}
public String getFileNameWithoutExt()
{
return null ;
}
// 返回文件的扩展名
public String getExt()
{
String[] values= fullName .split( "\\." );
return values[values. length -1];
}
// 不好用这个方法!!
public String getRealName()
{
String[] values= fullName .split( "\\\\\\" );
return values[values. length -1];
}
public String getBaseFileName() {
// First, ask the JDK for the base file name.
String fileName = new File( this . fileItem .getName()).getName();
// Now check for a Windows file name parsed incorrectly.
int colonIndex = fileName.indexOf( ":" );
if (colonIndex == -1) {
// Check for a Windows SMB file path.
colonIndex = fileName.indexOf( "\\\\" );
}
int backslashIndex = fileName.lastIndexOf( "\\" );
if (colonIndex > -1 && backslashIndex > -1) {
// Consider this filename to be a full Windows path, and parse it
// accordingly to retrieve just the base file name.
fileName = fileName.substring(backslashIndex + 1);
}
return fileName;
}
public void write(String path) throws Exception
{
try {
fileItem .write( new File(path));
} catch (Exception e) {
throw new Exception(e);
}
}
}
使用方法就是分的简单了:

FileUploadUtil fu;
fu = new FileUploadUtil(request,"c:/");
String name=fu.getParameter("name");
logger.info("字段名; name ,值:"+name);
Map fileMap=fu.getFilesMap();
UploadedFile ufile=(UploadedFile) fileMap.get("myFile");
…………
下面要做的工作就是保存到数据库中或硬盘上了,下次再说哦!!
写得不好,希望大家多提意见

你可能感兴趣的:(apache,jdk,windows,struts,servlet)