由于Struts收集到的多文件返回的是一个hashtable对象键值是html里面file标签的name属性现在的问题就是:我的表单上有一个 “产品图片”输入域,后面接的是这个file标签。之后有一个按钮,动态增加 一行我希望将“产品图片”上面的值,当做file标签的name,也就是当做hashtable里面的键值,传到action里面进行处理。请问我该如何实现。严格来说是一个JS的问题。。感谢各位高手帮忙。

解决方案 »

  1.   

    js  肯定要做js动态创建的上传file标签的所有name最好都一样,为区别说明,你可以加一个字段来命名。
    后台action中使用数组或者list接收  循环处理.前台注意js验证。
      

  2.   

    http://javamylovett.blog.163.com/blog/static/1734245692010118102735102/
    写了一个小demo
      

  3.   

    前台js 生成<input type="file" id="uploadFile" name="uploadFile"/>
    标签,你可以自己写js操作 dom来实现,也可以使用现成的东西,比如jquery-multiple-plugin 这个基于jquery的插件来进行.例如你前台通过这个插件生成多个上传的标签
    <input type="file" id="uploadFile" name="uploadFile"/>
    <input type="file" id="uploadFile" name="uploadFile"/>
    <input type="file" id="uploadFile" name="uploadFile"/>
    ...你的action中循环遍历,然后上传就可以了. //使用列表来接收上传文件
    private List<File> uploadFile;
    private List<String> uploadFileContentType;
    private List<String> uploadFileFileName;
            
            //getter和setter方法省略,注意文件命名的规则 uploadFile和标签中的name对应
              
              //上传
              if (fileCount > 0) { 
    for (int i = 0; i < uploadFile.size(); i++) { if (null != uploadFileFileName.get(i) && uploadFileFileName.get(i).trim().length() > 0) {
    ai = new ActivityImage(); String tempFileName = CommonUtils.reName(uploadFileFileName.get(i));
    String dir = ServletActionContext.getServletContext().getRealPath("/upload/activity");
    File dirs = new File(dir);
    if (!dirs.exists()) {
    dirs.mkdir();
    } String picturePath = dir + "/" + tempFileName;
    File imageFile = new File(picturePath);
    try {
                                                    //这里进行IO操作,拷贝文件流,你自己完成就行了 } catch (Exception e) {
    e.printStackTrace();
    }
    }
    }
    }
             
      

  4.   

    上面有个小错误
    file中的id一定要是唯一不重复的,这个插件生成的id都不一样,但name肯定一样..你自己写js也注意。
      

  5.   

    java多文件上传(通过commos包中的DiskFileUpload的类来重新封装请求)public ActionForward execute(ActionMapping mapping, ActionForm form,
       HttpServletRequest request, HttpServletResponse response) {
      // TODO Auto-generated method stub
      /*
       * PicForm pForm=(PicForm)form; FormFile file=pForm.getFile();
       * //获取上传的绝对路径 String
       * path=this.getServlet().getServletContext().getRealPath("/upload");
       * //获取文件名 String
       * filename=System.currentTimeMillis()+file.getFileName(); //上传的绝对路径
       * String filepath=path+"/"+filename; try { FileOutputStream fos=new
       * FileOutputStream(filepath); fos.write(file.getFileData());
       * fos.flush(); fos.close(); System.out.println("上传成功"); } catch
       * (Exception e) { // TODO: handle exception }
       */
      try {
       String dir = servlet.getServletContext().getRealPath("/upload");
    //   String path = this.getServlet().getServletContext().getRealPath(
    //   "/img");
       DiskFileUpload dfu = new DiskFileUpload();
       // 设置上传数据的最大大小为10M。
       dfu.setSizeMax(0xA00000);   // 设置内存缓冲区的阀值为512K。
       dfu.setSizeThreshold(0x80000);   // 设置临时存储文件的目录为E:\fileupload。
       dfu.setRepositoryPath("E:\\fileupload");   // 得到FileItem对象的列表。
       List fileItems = null;   fileItems = dfu.parseRequest(request);
       Iterator it = fileItems.iterator();
       while (it.hasNext()) {
        FileItem item = (FileItem) it.next();
        String filename = new String(item.getName().getBytes(
          "ISO8859-1"), "utf-8");
    //    System.out.println(item.getName() + item.getContentType()
    //      + item.getFieldName());
        
        System.out.println(item.getContentType());
        System.out.println(filename.substring(filename.lastIndexOf(".")));
        String filepath = dir + "/" + filename.substring(filename.lastIndexOf("\\"));
        item.write(new File(filepath));
        System.out.println("success");
       }
      } catch (Exception e) {
       e.printStackTrace();
      }  return null;
     }
     
    楼主参考下,希望对你有帮助