在用struts2上传文件的时候,怎么动态的控制上传的文件的个数,就是说,可以添加任意个<s:file>,也可以删除任意个<s:file>?

解决方案 »

  1.   

    上传任意多个文件    在Struts2中,上传任意多个文件也非常容易实现。首先,要想上传任意多个文件,需要在客户端使用DOM技术生成任意多个<input type=”file” />标签。name属性值都相同。代码如下:
    <html>
        <head>
            <script language="javascript">function addComponent()
    {
            var uploadHTML = document.createElement( "<input type='file'  name='upload'/>");
            document.getElementById("files").appendChild(uploadHTML);
            uploadHTML = document.createElement( "<p/>");
            document.getElementById("files").appendChild(uploadHTML);
    }
    </script>
        </head>
        <body>
            <input type="button" onclick="addComponent();" value="添加文件" />
            <br />
            <form onsubmit="return true;" action="/struts2/test/upload.action"
                method="post" enctype="multipart/form-data">
                <span id="files"> <input type='file' name='upload' />
                    <p />
                </span>
                <input type="submit" value="上传" />
            </form>
        </body></html>     上面的javascript代码可以生成任意多个<input type=’file’>标签,name的值都为file(要注意的是,上面的javascript代码只适合于IE浏览器,firefox等其他浏览器需要使用他的代码)。至于Action类,和上传单个文件的Action类基本一至,只需要将三个属性的类型改为List即可。代码如下:package action;import java.io.*;
    import com.opensymphony.xwork2.ActionSupport;public class UploadMoreAction extends ActionSupport
    {
        private java.util.List<File> uploads;
        private java.util.List<String> fileNames;
        private java.util.List<String> uploadContentTypes;    public java.util.List<String> getUploadFileName()
        {
            return fileNames;
        }
        public void setUploadFileName(java.util.List<String> fileNames)
        {
            this.fileNames = fileNames;
        }
        public java.util.List<File> getUpload()
        {
            return uploads;
        }    public void setUpload(java.util.List<File> uploads)
        {
            this.uploads = uploads;
        }    public void setUploadContentType(java.util.List<String> contentTypes)
        {
            this.uploadContentTypes = contentTypes;    }    public java.util.List<String> getUploadContentType()
        {
            return this.uploadContentTypes;
        }    public String execute() throws Exception
        {
            if (uploads != null)
            {
                int i = 0;
                for (; i < uploads.size(); i++)
                {
                    java.io.InputStream is = new java.io.FileInputStream(uploads.get(i));
                    java.io.OutputStream os = new java.io.FileOutputStream(
                            "d:\\upload\\" + fileNames.get(i));
                    byte buffer[] = new byte[8192];
                    int count = 0;
                    while ((count = is.read(buffer)) > 0)
                    {
                        os.write(buffer, 0, count);
                    }
                    os.close();
                    is.close();
                }
            }
            return SUCCESS;
        }
    }    在execute方法中,只是对List对象进行枚举,在循环中的代码和上传单个文件时的代码基本相同。如果读者使用过struts1.x的上传组件,是不是感觉Struts2的上传功能更容易实现呢?在Struts1.x中上传多个文件时,可是需要建立带索引的属性的。而在Struts2中,就是这么简单就搞定了。
      

  2.   

    增加是没有问题,但是删除呢?这样File就有空指针的异常?
      

  3.   


    <%@ page language="java" pageEncoding="GB2312"%>            <div id="file" >
                    <input type="file" name="file1">
                    <input name="提交" type="submit" value="上传文件">      
                    <input name="继续添加附件" type="button" value="继续添加" onclick="AddMore()">    
    </div>
    <script type="text/javascript">
            function AddMore(){
                var more = document.getElementById("file");
                var br = document.createElement("br");
                var input = document.createElement("input");
                var button = document.createElement("input");
                
                input.type = "file";
                input.name = "file";
                
                button.type = "button";
                button.value = "取消";
                
                more.appendChild(br);
                more.appendChild(input);
                more.appendChild(button);
                
                button.onclick = function(){
                    more.removeChild(br);
                    more.removeChild(input);
                    more.removeChild(button);
                }; 
            }
        </script>LZ参考一下!!!