struts多附件上传

原创 2007年09月11日 21:02:00

网上很多人都在问 struts多附件上传的问题:

搜索到的答案其中有:

Form部分:

public class MultiUploadForm extends ActionForm {
    private List myFiles;
    public MultiUploadForm(){
        myFiles = new ArrayList();
        //为了能够在页面初始显示一个file
        myFiles.add(new UploadFile());
    }
    public List getMyFiles() {
        return myFiles;
    }   

  //注意这个方法的定义

   public UploadFile getUploadFile(int index) {

int size = myFiles.size();
if (index > size-1) {
for (int i=0;i<index-size+1;i++){
myFiles.add(new UploadFile());
}
}
return (UploadFile) myFiles.get(index);
}

    public void setMyFiles(List myFiles) {
        this.myFiles = myFiles;
    }
}

Dataset部分:
public class UploadFile implements Serializable {
    private FormFile file;
    public FormFile getFile() {
        System.out.println("run in uploadFile.getFile()");
        return file;
    }
    public void setFile(FormFile file) {
        this.file = file;
    }
}

JSP部分:

<%@ page contentType="text/html; charset=GBK" %>
<%@ taglib uri="/WEB-INF/struts-html.tld" prefix="html" %>
<%@ taglib uri="/WEB-INF/struts-nested.tld" prefix="nested" %>

<html:html>
<head>
<title>
multiUploadDemo
</title>
</head>
<script language="javascript" type="">
   var num = 0;
   function addFile(){
      var innerHTML = multiUploadForm.innerHTML;
      var signal = "<TD id=tdTarget>";
      var signalLen = signal.length;
      var targetIndex = innerHTML.indexOf(signal);

      var preHTML = innerHTML.substring(0,(targetIndex-6));
      var subHTML = innerHTML.substring(targetIndex-6);
      num++;
      var insertHTML = "<TR><TD><input type=file name=uploadFile["+ num + "].file value=''></TD>";
      innerHTML = preHTML + insertHTML + subHTML;

      multiUploadForm.innerHTML = innerHTML;
      //alert(multiUploadForm.innerHTML);
   }
   function upload(){
     multiUploadForm.submit();
   }
</script>
<body bgcolor="#ffffff">
<html:form method="post" action="/multiUploadAction.do" enctype="multipart/form-data">
<table border="1">
<TBODY>
<br><br>

this is file
  <nested:iterate id="uploadFile" property="myFiles" name="multiUploadForm" indexId="index">
      <nested:nest property="uploadFile">
        <nested:file property="file" name="uploadFile" indexed="true"/>
      </nested:nest>
  </nested:iterate>


<TR>
  <input type="button" name="btnAddFile" value="Add File" onclick="addFile()"/>
  <TR><TD id="tdTarget"></TD>
  <input type="button" name="btnUpload" value="upload" onclick="upload()">
</TBODY>
</table>
</html:form>
</body>
</html:html>

这样的方法我也用了很长时间,谢谢原作者的共享;

从jsp再看form定义,很难理解文件怎么付到arraylist变量中去的?

今天从基本的方式尝试去解决, 定义 FormFile[] 和 FormFile 的arraylist; 都会报数组越界的错误;

仔细看了好多遍原代码,原来 struts 的 form 属性付值用的是 BeanUtils 的方式;BeanUtils只是简单使用过,还不了解它的强大功能;看原代码

public void setIndexedProperty(Object bean, String name,
                                          int index, Object value)

{.............

        // Call the property getter to get the array or list
        Object array = invokeMethod(readMethod, bean, new Object[0]);
        if (!array.getClass().isArray()) {
            if (array instanceof List) {
                // Modify the specified value in the List
                ((List) array).set(index, value);
            } else {
                throw new IllegalArgumentException("Property '" + name +
                        "' is not indexed");
            }
        } else {
            // Modify the specified value in the array
            Array.set(array, index, value);
        }

}

用的 list 的 set 方法,而不是add方法;所以出现了越界的错误;上面实现的 public UploadFile getUploadFile(int index) 方法的实现就是解决这个问题的;同时原作者利用了BeanUtils中NestedProperty的特点,从而成功组装form的。

但是,总是要定义一个新的类曾加一层逻辑,总感觉不舒服;所以我用继承ArrayList的方式实现不会越界的list

public class DynaSetArrayList extends ArrayList {

 public Object set( int index, Object obj )
 {
  int size = size();
  if( index > size-1)
  {
   for( int i=0; i< index-size+1; i++)
   {
       add( new Object());
   }
  }
  Object old = get( index );
  super.set( index, obj );
  return old;
 }
 
}

这样form 类只简单定义List attachs = new DynaSetArrayList();就可以了,比较简单。

 

 

struts2附件上传,大小超过最大值处理

Action: Java代码   /**            * 当上传文件大小大于struts.multipart.maxSize提示时,            * 客户...

swf 多附件同时上传 进度条

  • 2016年08月08日 15:21
  • 183KB
  • 下载

ionic2中选取相册图片并支持多附件上传的

最近在研究的ionic2,准备公司项目用该框架来写。近期在做多附件上传时遇到问题了,先简单的说下自己所遇到的具体问题和解决方案。另外强调下,由于web这块之前是一窍不通,经过一段时间的学习从最简单的h...

多附件上传MultiUpload

  • 2010年04月08日 20:24
  • 197KB
  • 下载

多附件大容量上传组件

  • 2008年02月18日 09:57
  • 123KB
  • 下载

domino uploadify不刷新页面上传多附件

最近几天假期,把以前的domino上传附件和删除附件不刷新页面的知识整理,这里的是把附件上传到当前文档,理论同样可以上传到ftp,其它数据库等。把一些界面也发给大家交流,希望对大家有用。 使用到的知识...

SWFUpload多附件上传控件DEMO

  • 2010年07月13日 13:16
  • 401KB
  • 下载

.net多附件上传示例源码

  • 2017年09月01日 09:07
  • 10.02MB
  • 下载
内容举报
返回顶部
收藏助手
不良信息举报
您举报文章:struts多附件上传
举报原因:
原因补充:

(最多只允许输入30个字)