struts2多文件上传时,比如:
xx.jsp中包含两个同名的文本框和文件域。这里运行用户只填写用户名。文件选填
<form name="myform" method="post" action="add.action" enctype="multipart/form-data">
<input type="text" name="user" /><input type="file" name="pic" />
<input type="text" name="user" /><input type="file" name="pic" />
</form>在Action类文件如下(只写关键部分)
Java code
        private List<File> pic;
        private List<String> user;
        //对应的getter 和 setter方法略
         public String execute(){
        //(1)下面种情况,只有当文件域都为空或者都不为空时可用。
               for(int i=0;i<user.size();i++){
               if(pic!=null){
                  //上传文件和将user,pic路径信息写入数据库.
               }else{
                  //只将user信息写入数据库.
                }
             }
        //(1)下面种情况,必须文件域都不为空,否则将抛出nullpointexception。
             for(int i=0;i<user.size();i++)
                 if(pic.get(i)!=null){
                  //上传文件和将user,pic路径信息写入数据库.
               }else{
                  //只将user信息写入数据库.
               }
        }
  自己测试了下:System.out.print(user.size());值都等于2
             System.out.pring(pic.size());当两个文件域都为空是=0,一个填写=1,都填写=2
这样的话,就不好将对应的信息写入数据库了。请教解决办法springFile类型Action

解决方案 »

  1.   

    user 和他匹配的文件域的文件不是应该同List 的同一位置吗?get(i)
    但是如果文件域为空。List<File>就没有被自动注入。
    这个应该可以证明:
    System.out.print(user.size());值一直都等于2 
    ============
    System.out.pring(pic.size());
    当两个文件域都为空是=0
    一个文件域为空,输出1.
    两个都不空。输出2
    但是user应为是List<String> 所以填不填都是输出的2,不填也add()了元素
      

  2.   

    楼主数据库字段是怎么定义的?况且你就是上传2个文件,也不是无限制的批量,完全可以定义一个pic1
      

  3.   

    每个user对应一个pic,user可以动态添加,而且可能有些user没有上传对应的pic,那么在Action中如何将user和pic对应呢?
      

  4.   

    user[i]和pic[i]是一对应的同一个人吧
      

  5.   

    是呀,但是如果没有选择上传图片的话,pic并没有直接注入空值。
    比如有两个user,一个上传pic,另一个没有上传,那么user.length的长度为2,而pic.length的长度为1!
      

  6.   

    是呀,但是如果没有选择上传图片的话,pic并没有直接注入空值。
    比如有两个user,一个上传pic,另一个没有上传,那么user.length的长度为2,而pic.length的长度为1!
    要真是这样,我认为你提交的时候可以通过js把上传文件的tr的行表传给action也可以,我以为即使2个file都不上传action接到的长度也是2呢
      

  7.   

    你把 User 那个list 的元素都打印出来。怎么可能页面为空user里面有值?最多是"",你就通过这个判断就好了。
      

  8.   

    把user和pic用一个类User封装起来
    action:
    private List<User> people;
    xx.jsp:
    <form name="myform" method="post" action="add.action" enctype="multipart/form-data">
    <input type="text" name="people.user" /><input type="file" name="people.pic" />
    <input type="text" name="people.user" /><input type="file" name="people.pic" />
    </form>
      

  9.   

    把user和pic封装成一个对象,然后就可以同时添加到数据库了。
      

  10.   

    你这样说好像是有道理的,那么在action中应该如何写呢?
      

  11.   

     
            private List<User> people;
            //对应的getter 和 setter方法略
             public String execute(){
                for(int i=0;i<people.size();i++){
                   File pic=people.getPic();
                   String user=people.getUser();
                   if(pic!=null){
                      //上传文件和user,pic路径信息写入数据库.
                   }else{
                      //只将user信息写入数据库.
                    }
                 }
            }
      

  12.   

    中间少了一点东西               File pic=people[i].getPic();                String user=people[i].getUser(); 
      

  13.   

    很感谢你,你提供了很好的思路。因为我对后台稍有了解,前台是另个同伴在做。在前台直接像你那样写就好了,还是要引入java bean什么的呢?
      

  14.   

    多谢你啊  基本可用了,写成如下:public class TestAction extends ActionSupport
    {
    private static final long serialVersionUID = 1L;
    private List<User> people;
    //setter、getter方法
    public String execute()
    throws Exception
    {
    System.out.println(people.size());
    for(int i=0;i<people.size();i++)
    {
    File pic=people.get(i).getPic();     
    String picContentType=people.get(i).getPicContentType();
    String picFileName=people.get(i).getPicFileName();
    String user=people.get(i).getUser();
    System.out.println("pic:"+pic+" "+"picContentType:"+picContentType+" "+"picFileName:"+picFileName);
    }
    return "SUCCESS";
    }
    }class User
    {
    private String user;
    private File pic;              
    private String  picContentType;//上传文件的类型     
    private String picFileName;
    //setter、getter方法

    public User(String user, File pic, String picContentType, String picFileName) {
    super();
    this.user = user;
    this.pic = pic;
    this.picContentType = picContentType;
    this.picFileName = picFileName;
    }
    public User() {
    super();
    }

    }但是如果在jsp页面填写完成之后怎么people的长度为8呢,显示结果如下:8
    pic:E:\Java\MyEclipseProject\.metadata\.me_tcat\work\Catalina\localhost\DataImportSystemBeta2\upload_a70ee86_13f5baddf5e__8000_00000006.tmp picContentType:null picFileName:null
    pic:E:\Java\MyEclipseProject\.metadata\.me_tcat\work\Catalina\localhost\DataImportSystemBeta2\upload_a70ee86_13f5baddf5e__8000_00000008.tmp picContentType:null picFileName:null
    pic:null picContentType:image/x-png picFileName:null
    pic:null picContentType:image/pjpeg picFileName:null
    pic:null picContentType:null picFileName:xjkb.png
    pic:null picContentType:null picFileName:天猫刷刷.jpg
    pic:null picContentType:null picFileName:null
    pic:null picContentType:null picFileName:null一个file被提交了四次!
      

  15.   

    我发现这样做以后jsp中的people.user和people.pic没有对应起来,
    如果直接这样写,用户把这四个控件都赋值,提交以后得到的people.size()为4。
    能帮忙解答一下吗
      

  16.   

    User类里每个变量都要写个各自的getter和setter方法
      

  17.   

    问题解决了,多谢多谢,不过这里有点小小问题。
    xx.jsp:
    <form name="myform" method="post" action="add.action" enctype="multipart/form-data">
    <input type="text" name="people[0].user" /><input type="file" name="people[0].pic" />
    <input type="text" name="people[1].user" /><input type="file" name="people[1].pic" />
    </form>
    people后面必须加下标,不加下标的话会对应4个people。加了下标的话user和pic对应起来!
    感谢,给分!