Struts中不限个数上传文件的实现方案

      在使用Struts的系统中使用 org.apache.struts.upload.FormFile 可以很方便的实现文件的上传,无论是单个或者多个文件。不过又应该如何来实现不限个数的文件上传呢?
      首先,在Jsp页面中,需要有像163那样动态添加附件的功能,这个可以使用JS来实现。代码如下:
       
                                            <tr bgcolor="#FFFFFF">
                                                
<td nowrap id="fileTD" align="center" colSpan="2">
                                                    
<input name="uploadFile(0)" type="file" size="40">
                                                    
<input type="button" onclick="addFile()" value="添加"/>
                                                
</td>
                                            
</tr>

    var fileIndex = 0;
    
function addFile() 
    
{
        fileIndex
++;
        
var spanId = "fileTD";
        
var fileId = "uploadFile(" +fileIndex+ ")";
        addInputFile(spanId, fileId);
    }

    
function addInputFile(spanId, fileId) 
    
{
        
var span = document.getElementById(spanId);
        
if (span != null
        
{
            
var divObj = document.createElement("div");
            
var fileObj, delObj;
            divObj.id 
= fileId;
               fileObj 
= document.createElement("<input type=file>");
               delObj 
= document.createElement("<input type=button onclick=delInputFile('" + spanId + "','" + fileId + "')>");
            fileObj.name 
= fileId;
            fileObj.size 
= "40";
            fileObj.className = "input";
            delObj.value 
='删除';
            divObj.appendChild(fileObj);
            divObj.appendChild(document.createTextNode(
" "));
            divObj.appendChild(delObj);
            span.appendChild(divObj);
        }

    }

    
function delInputFile(spanId, fileId) 
    
{
        
var span = document.getElementById(spanId);
        
var divObj = document.getElementById(fileId);
        
if (span != null && divObj != null
        
{
            span.removeChild(divObj);
        }

    }

上面代码中的Html和JS代码就可以实现动态添加行的效果。(上述JS代码参考了一位网友的实现,这里对他表示感谢。)
Html代码中的 <input name="uploadFile(0)" type="file" size="40">容易让人迷惑,我也是第一次写 name="uploadFile(0)"这样的Html代码
这里的uploadFile(0)表示数组中index=0的元素,那么在Struts的FormBean中又应该如何让BeanUtils在做反射的时候可以正确的赋值呢?
来看一下FormBean中的代码:
import java.util.ArrayList;

import org.apache.struts.action.ActionForm;
import org.apache.struts.upload.FormFile;

public class BulletinInfoForm extends ActionForm {
    
private static final long serialVersionUID = -7869342360944575352L;

    
private Long id;
    
    
private String newsTitle;
    
    
private String newsType;
    
    
private String newsContent;

    
private ArrayList<FormFile> uploadFiles = new ArrayList<FormFile>();

    
public void setUploadFile(String index, FormFile formFile) {
        
this.uploadFiles.add(formFile);
    }


    
public ArrayList<FormFile> getUploadFiles() {
        
return this.uploadFiles;
    }


    
public Long getId() {
        
return id;
    }


    
public void setId(Long id) {
        
this.id = id;
    }


    
public String getNewsContent() {
        
return newsContent;
    }


    
public void setNewsContent(String newsContent) {
        
this.newsContent = newsContent;
    }


    
public String getNewsTitle() {
        
return newsTitle;
    }


    
public void setNewsTitle(String newsTitle) {
        
this.newsTitle = newsTitle;
    }


    
public String getNewsType() {
        
return newsType;
    }


    
public void setNewsType(String newsType) {
        
this.newsType = newsType;
    }


    
}

留意以上代码中的
public void setUploadFile(String index, FormFile formFile) {
        
this.uploadFiles.add(formFile);
    }


这里提供的setUploadFIle(String index, FormFile formFile)其实就是给BeanUtils一个正确的借口,让它可以对uploadFile(0)这样的元素进行正确的反射。当然,这里不用考虑index,直接将formFile添加进list中。

      因此,在Struts中不限个数上传文件的实现中,主要是页面中动态添加上传文件行和在FormBean中正确赋值,Action中要做的相信就很简单了,只要把FormBean中的List取出来逐个进行操作。
      
posted on 2006-09-01 11:38 旱头憨脑 阅读(410) 评论(0)  编辑  收藏 所属分类: j2ee

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


网站导航: