使用 FileUpLoad 包进行文件上传。
进行文件上传一般有三种方式
1. 使用 fileUpLoad
2. 使用 smartFileUpLoad
3. 自己编写类似的程序进行解析
下面介绍一下第一种方式的使用方法:
fileUpLoad 是 apache 的一个开源项目,用来进行解析带有文件的请求处理。著名的 struts 的FormFile 就是用的它进行解析处理的。
1. 首先页面上我们需要将表单设置下面类似的参数:
< form method="post" enctype="multipart/form-data" action=”………… ” >
2. 然后我们需要在工程里导入所需要的包,可以在 apache 网站上下载:
http://jakarta.apache.org/commons/fileupload/
3. 在我们的servlet中可以获取到request参数,然后可以这样取传递过来的字段参数及文件参数:
在这里我写了两个类去生成并存储字段和文件的值:
可以跟着红色的注释代码看一下实现的过程
/**
*封装了 FileUpload 类,实现文件上传功能
*/
publicclass FileUploadUtil {
privatestatic 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
*@paramrequest
*@paramtempDirectory
*@throwsBaseWebException
*/
//当生成一个类时就开始了对 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) {
thrownew 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 方法,取得非文件的字段
*如果为多个值的,只返回第一个
*@paramparam
*@return 为空或键值不存在返回 null
*/
public String getParameter(String param)
{
if(param==null)
{
returnnull;
}
else
{
Vector vec=(Vector)fieldsMap.get(param);
if(vec!=null&&vec.size()>0)
{
return (String)vec.get(0);
}
elsereturnnull;
}
}//getParameter
public String[] getParameterValues(String param)
{
String[] values=null;
if(param==null)
{
returnnull;
}
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
{
returnnull;
}
}//else
}
/**
*
*返回上传的文件的名称,如若没这个参数名,返回 null
*@paramparamName
*@return
*/
public String getFileName(String paramName)
{
if(paramName!=null)
{
UploadedFile uploadedFile=(UploadedFile)this.filesMap.get(paramName);
if(uploadedFile!=null)
{
return uploadedFile.getRealName();
}
}
returnnull;
}
/**
*这个方法用来将文件字段保存在硬盘上。
*@paramparamName
*@paramnewNameWithoutExt
*@paramrelativePath
*@throwsBaseWebException
*/
publicvoid 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);
}
}
}
publicstaticvoid main(String[] args)
{
}
public List getFileItems() {
returnfileItems;
}
publicvoid setFileItems(List fileItems) {
this.fileItems = fileItems;
}
public HashMap getFieldsMap() {
returnfieldsMap;
}
publicvoid setFieldsMap(HashMap fieldsMap) {
this.fieldsMap = fieldsMap;
}
public HashMap getFilesMap() {
returnfilesMap;
}
publicvoid setFilesMap(HashMap filesMap) {
this.filesMap = filesMap;
}
public DiskFileUpload getFu() {
returnfu;
}
publicvoid setFu(DiskFileUpload fu) {
this.fu = fu;
}
public HttpServletRequest getRequest() {
returnrequest;
}
publicvoid setRequest(HttpServletRequest request) {
this.request = request;
}
}
//辅助的文件封装字段,还很不完善,比如缺少获取文件流的方法,以后考虑创建 adapter
//来实现封装对象 fileItem 的一些方法。这里主要提供了获取扩展名和文件名的方法,比较//简陋
publicclass UploadedFile {
private String fullName="";
public FileItem fileItem;
/**
*@paramfileItem
*/
public UploadedFile(FileItem fileItem) {
this.fileItem = fileItem;
fullName=fileItem.getName();
}
public String getFileNameWithoutExt()
{
returnnull;
}
//返回文件的扩展名
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;
}
publicvoid write(String path) throws Exception
{
try {
fileItem.write(new File(path));
} catch (Exception e) {
thrownew 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");
…………
下面要做的工作就是保存到数据库中或硬盘上了,下次再说哦!!
写得不好,希望大家多提意见
标签:
本站文章除注明转载外,均为本站原创或翻译。欢迎任何形式的转载,但请务必注明出处、不得修改原文相关链接,如果存在内容上的异议请邮件反馈至chenjj@evget.com