我的漫漫程序之旅

专注于JavaWeb开发
随笔 - 39, 文章 - 310, 评论 - 411, 引用 - 0
数据加载中……

Struts1.2实现动态多文件(不定个数)上传

只帖出关键代码,如有问题可以回复.
前台jsp页:
<script language="javascript" type="text/javascript">
function createElement(tagName, type, name)
{
   
var element = null;
   
try
   
{
      element 
= document.createElement('<+ tagName + ' name="'+name+'" size=30 onchange="add();"/>');
      element.type 
= type;
      element.value 
= value;
   }

   
catch (e)
   
{
   }

   
if ( ! element)
   
{
      element 
= document.createElement(tagName);
      element.setAttribute(
"type", type);
   }

   
return element;
}

// 动态创建表单控件的方法
var i = 1;
function add()
{
   
// 动态创建控件名称
   var name = "attachment" + i;
   
var input1 = createElement("input""file", name);
   
var br = document.createElement("<br />");
   
var files = document.getElementById("files");
   files.appendChild(br);
   files.appendChild(input1);
   i 
++ ;
}

</script>
<!--
************************
        附件
************************
-->
<div id="files">
<input type="file" size="30" name="attachment0" onchange="add();" alt="选择后即可动态添加文件域"/>
<input type="button" onclick="add();" value="多个附件" alt="手动添加文件域"/>
&nbsp;<font color=green><alt="不支持的文件类型将会被直接过滤掉">支持的文件类型(.rar,.zip,.txt,.sql,.ini,.jpg,.bmp,.gif)</a></font>
</div>

Action中的关键代码:
FormFile[] formFile = null;
        
// 得到所有的文件请求元素
        Hashtable files = bbsForm.getMultipartRequestHandler()
                .getFileElements();
        
if (files != null && files.size() > 0)
        
{
            
// 初始化FormFile
            formFile = new FormFile[files.size()];
            
// 得到files的keys
            Enumeration enums = files.keys();
            String fileKey 
= null;
            
int i = 0;
            
// 遍历枚举
            while (enums.hasMoreElements())
            
{
                
// 取得key
                fileKey = (String) (enums.nextElement());
                System.out.println(
"key:" + fileKey);
                
// 初始化每一个FormFile(接口)
                formFile[i] = (FormFile) files.get(fileKey);
                
// 分别上传
                upload(formFile[i], request, bbs);
                i
++;
            }


        }

upload方法:
/**
     * 文件上传的方法
     * 
     * 
@param file
     * 
@param request
     * 
@param bbs
     
*/

    
public void upload(FormFile file, HttpServletRequest request, Bbs bbs)
    
{
        
//只有选择了文件时才上传
        if ("".equals(file.getFileName()) || null == file.getFileName())
        
{
            
return ;
        }

        
// 得到当前网站的绝对路径
        String path = this.getServlet().getServletContext().getRealPath("/");
        FileOutputStream fileOutput;
        
try
        
{
            
// 文件操作
            fileOutput = new FileOutputStream(path + "main/upload/"
                    
+ file.getFileName());
            fileOutput.write(file.getFileData());
            fileOutput.flush();
            fileOutput.close();
            log.info(
"BbsAction:附件上传成功");
        }

        
catch (FileNotFoundException e)
        
{
            log.info(
"BbsAction:找不到文件");
        }

        
catch (IOException e)
        
{
            log.info(
"BbsAction:文件IO异常");
        }

        
// 数据库操作
        Fileupload fileupload = new Fileupload();
        String basePath 
= request.getScheme() + "://" + request.getServerName()
                
+ ":" + request.getServerPort() + request.getContextPath()
                
+ "/";
        fileupload.setFilename(basePath 
+ "/main/upload/" + file.getFileName());
        
// 得到文件的扩展名
        int point = file.getFileName().lastIndexOf(".");
        String ext 
= file.getFileName().substring(point + 1);
        
//扩展名处理
        if ("jpg".equals(ext.toLowerCase()) || "bmp".equals(ext.toLowerCase())
                
|| "gif".equals(ext.toLowerCase()))
        
{
            ext 
= "img";
        }

        
if ("rar".equals(ext.toLowerCase()) || "zip".equals(ext.toLowerCase())
                
|| "jar".equals(ext.toLowerCase()))
        
{
            ext 
= "rar";
        }

        
if("txt".equals(ext.toLowerCase()) || "sql".equals(ext.toLowerCase()) || "ini".equals(ext.toLowerCase()))
        
{
            ext 
= "txt";
        }

        fileupload.setFileext(ext);
        fileupload.setFilesize(file.getFileSize());
        fileupload.setUptime(
new Date());
        fileupload.setDowncount(
0);
        fileupload.setUpuser(((User) request.getSession().getAttribute(
"user"))
                .getUserName());
        fileupload.setFlag((
short0);
        fileupload.setAnnounceId(bbs.getAnnounceId());
        fileupload.setName(file.getFileName());
        fileuploadManager.save(fileupload);
        log.info(
"BbsAction:附件信息已经成功保存到数据库");
    }

这样就实现的动态的多文件上传.关键还是
Hashtable files = bbsForm.getMultipartRequestHandler()
                .getFileElements();
的处理.
其中的数据库操作部分不是必须的.
这是从我的项目中提取出来的,懒得写个干净的了.


posted on 2008-01-31 18:27 々上善若水々 阅读(4972) 评论(7)  编辑  收藏 所属分类: Struts1.x

评论

# re: Struts1.2实现动态多文件(不定个数)上传  回复  更多评论   

请问一下,bbsForm.getMultipartRequestHandler().getFileElements();
bbsForm 是你的 Form 吗?里面要定义属性吗?这个方法是根据什么获取所有文件集体的呢?
2008-05-06 11:39 | Freely

# re: Struts1.2实现动态多文件(不定个数)上传  回复  更多评论   

bbsForm.getMultipartRequestHandler().getFileElements();
为什么只取到1个文件??
我用System.out.print(files .size()); 结果为1
2008-05-06 14:09 | snakee

# re: Struts1.2实现动态多文件(不定个数)上传  回复  更多评论   

这个是没有问题的。这个是我项目中的代码。

请检查你的 form类型enctype="multipart/form-data"

否则只能得到一个。
2008-05-06 15:27 | 々上善若水々

# re: Struts1.2实现动态多文件(不定个数)上传[未登录]  回复  更多评论   

能不能把FORM中的相关代码也给出来啊?我是菜鸟还不能领会FORM中是怎么实现的。谢谢了。
2008-05-19 15:31 | 小鸟

# re: Struts1.2实现动态多文件(不定个数)上传  回复  更多评论   

太感谢了!!
2009-02-20 17:35 | weihan

# re: Struts1.2实现动态多文件(不定个数)上传[未登录]  回复  更多评论   

hhhh
2009-11-05 16:26 | hh

# re: Struts1.2实现动态多文件(不定个数)上传[未登录]  回复  更多评论   

nnn
2009-11-05 16:27 | hh

只有注册用户登录后才能发表评论。


网站导航: