使用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");
…………
下面要做的工作就是保存到数据库中或硬盘上了,下次再说哦!!
写得不好,希望大家多提意见