fileUpload控件使用方法介绍(有试例源代码哦!)
来源:互联网 发布:淘宝一件衣服不同价格 编辑:程序博客网 时间:2024/06/05 18:48
使用FileUpLoad包进行文件上传。
进行文件上传一般有三种方式
使用fileUpLoad
使用smartFileUpLoad
自己编写类似的程序进行解析
下面介绍一下第一种方式的使用方法:
fileUpLoad是apache的一个开源项目,用来进行解析带有文件的请求处理。著名的struts的FormFile就是用的它进行解析处理的。
1首先页面上我们需要将表单设置下面类似的参数:
< form method="post" enctype="multipart/form-data" action=”………… ” >
2 然后我们需要在工程里导入所需要的包,可以在apache网站上下载:
http://jakarta.apache.org/commons/fileupload/
3 在我们的servlet中可以获取到request参数,然后可以这样取传递过来的字段参数及文件参数:
在这里我写了两个类去生成并存储字段和文件的值:
可以跟着红色的注释代码看一下实现的过程
/**
*@authorsxy
*
*封装了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");
…………
下面要做的工作就是保存到数据库中或硬盘上了,下次再说哦!!
写得不好,希望大家多提意见
- fileUpload控件使用方法介绍(有试例源代码哦!)
- FileUpload控件使用方法
- fileupload 控件使用方法
- Commons FileUpload组件使用方法详解(包含源代码) --(转)
- Commons FileUpload组件使用方法(包含源代码)
- Commons FileUpload组件使用方法详解(包含源代码)
- Commons FileUpload组件使用方法详解(包含源代码)--转
- Fileupload使用方法
- Fileupload使用方法
- [置顶]对FileUpload文件上传控件的一些使用方法说明
- FileUpLoad控件
- FileUpload控件
- FileUpload控件
- FileUpLoad控件
- FileUpload控件
- fileupload控件
- fileupload控件
- FileUpload控件
- JAVA实现的时钟实现
- IBM Rational Rose读书笔记 (5)
- IBM Rational Rose读书笔记 (6)
- how to write a module dumper & disassembler
- 关于双缓冲绘图(上)
- fileUpload控件使用方法介绍(有试例源代码哦!)
- php扩展:如何访问php数组
- 关于双缓冲绘图(下)
- 路边的小摊还是不要吃了……
- ATL的GUI程序设计(2)
- ATL的GUI程序设计(1)
- ATL的GUI程序设计(前言)
- 第一次使用CSDN的Blog
- ATL的GUI程序设计(3)