代码太多,就贴下代码,说下问题。
解释下代码什么意思,这是我批量上传的部分代码,例如我一起上传a.doc,b.doc,c.doc这3个word文档,那么在打印System.out.println(str);后面是我自已加了个分割符★,这句话的结果是,a.doc★b.doc★c.doc★  是这样的结果,然后我用session存起来了。 session.setAttribute("filespath",str);
但是现在的问题来了,我在另一个jsp页面取值,String zlfielpath = (String)session.getAttribute("filespath");
然后打印结果是这样的,c.doc★   取的值都是最后一个,我怀疑是在上传文件的时候,也是一条一条上传的,所以应该是后一条把前一条给覆盖了,所以session存的是最后一条记录
大家看下,我想把这些值都取到 List<?> items = upload.parseRequest(request);
FileItem item = null;
String fileName = null;
String str ="";
for (int i = 0 ;i < items.size(); i++){
item = (FileItem) items.get(i);
fileName = saveurl + File.separator + item.getName();
// 保存文件

if (!item.isFormField() && item.getName().length() > 0) {
item.write(new File(fileName));

 str+=item.getName()+"★";//这里是把文档的名称拼起来,
          System.out.println(str);
 session.setAttribute("filespath",str);//然后用session存起来
} }

解决方案 »

  1.   

    必然都覆盖么
    在if循环里面判断下
    session.getAttri...("filespath")
    先看下是否为空
    为空的话新建一个,值为a.doc
    非空的话先取出来
    然后在后面append 星号b.doc
    依次类推
      

  2.   

    一楼的建议不错,
    你先在循环里面把session的存的东西在后台打出来,看看到底 最后一次存的啥子,如果真像你自己说的 的覆盖了你就 按一楼的方法先判断一下再进行处理
      

  3.   

    我意思你把 session.setAttribute("filespath",str);//然后用session存起来
    放循环外面
    循环里面当然只有最后一次的了
      

  4.   


    外面也是最后一次的,   List<?> items = upload.parseRequest(request);
                FileItem item = null;
                String fileName = null;
                String str ="";
                for (int i = 0 ;i < items.size(); i++){
                    item = (FileItem) items.get(i);
                    fileName = saveurl + File.separator + item.getName();
                    // 保存文件
                
                    if (!item.isFormField() && item.getName().length() > 0) {
                        item.write(new File(fileName));
        
                         str+=item.getName()+"★";//这里是把文档的名称拼起来,
                              System.out.println(str);
                                         }            }session.setAttribute("filespath",str);//然后用session存起来
    是这个意思吗,这个也是一样的,都是最后一个值,因为批量上传也是一条一条的,所以应该最后一次总会覆盖前一条的。
      

  5.   

    在循环外面定义一个String str
    每次用str = str+星号+filename;
    这样才能都保存了
      

  6.   


    他的逻辑是对的的啊,他的str是在循环外面定义的,咋回事喃
      

  7.   


    还是不行,
    List<?> items = upload.parseRequest(request);
    FileItem item = null;
    String fileName = null;
    String str ="";
    String tt = "";
    for (int i = 0 ;i < items.size(); i++){
    item = (FileItem) items.get(i);
    fileName = saveurl + File.separator + item.getName();
    // 保存文件

    if (!item.isFormField() && item.getName().length() > 0) {
    item.write(new File(fileName));

    //System.out.println("路径"+item.getName()+"★");
     str=item.getName()+"★";
     

    } }
    tt+=str;
     session.setAttribute("filespath",tt);这样吗。
      

  8.   

    汗 每次上传的时候先从session里面把以前的取出来
    然后和你当前上传的str 拼起来不就完了
      

  9.   

      String tt = session.getAttribute("filespath");
      

  10.   


    String tt = session.getAttribute("filespath") == null ? "" : session.getAttribute("filespath").toString();
      

  11.   

    session.setAttribute("filespath",str);//然后用session存起来
    提到for循环外.
      

  12.   

    额 都被你误导了 你每次打开的页面不一样
    session都不一样 怎么存呀
    自己写个util类 定义一个公共字段 最好是MAP
    每次上传按用户ID 去找这个MAP的里面的对象 也就是个字符串
    然后对这个字符串操作
    或者你用memcached 去存
    session 本来就比较可贵 不是频繁要用的 别什么都往进扔
      

  13.   


    public void doPost(HttpServletRequest request, HttpServletResponse response)
    throws ServletException, IOException {
    HttpSession session = request.getSession();
    DiskFileItemFactory factory = new DiskFileItemFactory();
    // 设置内存缓冲区,超过后写入临时文件
    factory.setSizeThreshold(10240000);
    // 设置临时文件存储位置
     String root = request.getRealPath("")+"\\upwordzl";
     String saveurl=root+"\\";
    File file = new File(saveurl);
    if(!file.exists())
    //file.mkdirs();  创建文件夹
    factory.setRepository(file);
    ServletFileUpload upload = new ServletFileUpload(factory);
    // 设置单个文件的最大上传值
    upload.setFileSizeMax(10002400000l);

    // 设置整个request的最大值
    upload.setSizeMax(10002400000l);
    upload.setHeaderEncoding("UTF-8"); try {
    List<?> items = upload.parseRequest(request);
    FileItem item = null;
    String fileName = null;
    String str = "";
    for (int i = 0 ;i < items.size(); i++){
    item = (FileItem) items.get(i);
    fileName = saveurl + File.separator + item.getName();
    // 保存文件

    if (!item.isFormField() && item.getName().length() > 0) {
    item.write(new File(fileName));
    str =item.getName()+"★";
    } }

     session.setAttribute("filespath",str);//session存值

     
    } catch (FileUploadException e) {
    e.printStackTrace();
    } catch (Exception e) {
    e.printStackTrace();
    }


    }这个页面比如我上传几个文件,这个页面就执行几次,所以每执行一次,session里面的值就会被后面的给覆盖掉,,,,,我想用什么办法,可以都存储下来。
      

  14.   

    简单说 你在一个类里定义一个public Map 变量集合
    每次进入action的时候 你从这个类的 map集合中 通过key值 取出保存的上传文件名字符串
    假如是A用户 上传的
    String fileName = map.get("A").toString();
    返回的就是A用户已经上传的文件名字符串 
    下来你就可以
    FileNameUtil.map.put("A",fileName +str);
      

  15.   

    for (int i = 0 ;i < items.size(); i++){
                    item = (FileItem) items.get(i);
                    fileName = saveurl + File.separator + item.getName();
                    // 保存文件
                
                    if (!item.isFormField() && item.getName().length() > 0) {
                        item.write(new File(fileName));
        
                         str+=item.getName()+"★";//这里是把文档的名称拼起来,
                              System.out.println(str);
                         
                    }
    }
    session.setAttribute("filespath",str);//这句放到循环外边
      

  16.   

    str初始化的时候不能直接为空,应该从session中取到上次的值,然后在这基础上累加,就不会覆盖了。另外一般上传文件都要把每个文件相关的信息保存到数据库中,而不是session中,服务器一重启session里面的东西就没了哈!
    public void doPost(HttpServletRequest request, HttpServletResponse response)
                throws ServletException, IOException {
            HttpSession session = request.getSession();
            DiskFileItemFactory factory = new DiskFileItemFactory();
            // 设置内存缓冲区,超过后写入临时文件
            factory.setSizeThreshold(10240000);
            // 设置临时文件存储位置
             String root = request.getRealPath("")+"\\upwordzl";
             String saveurl=root+"\\";
            File file = new File(saveurl);
            if(!file.exists())
                //file.mkdirs();  创建文件夹
            factory.setRepository(file);
            ServletFileUpload upload = new ServletFileUpload(factory);
            // 设置单个文件的最大上传值
            upload.setFileSizeMax(10002400000l);
            
            // 设置整个request的最大值
            upload.setSizeMax(10002400000l);
            upload.setHeaderEncoding("UTF-8");        try {
                List<?> items = upload.parseRequest(request);
                FileItem item = null;
                String fileName = null;
                String str = session.getAttribute("str")==null?"":session.getAttribute("str");
                for (int i = 0 ;i < items.size(); i++){
                    item = (FileItem) items.get(i);
                    fileName = saveurl + File.separator + item.getName();
                    // 保存文件
                
                    if (!item.isFormField() && item.getName().length() > 0) {
                        item.write(new File(fileName));
                        str =item.getName()+"★";
                    }            }
                
                 session.setAttribute("filespath",str);//session存值
                
                 
            } catch (FileUploadException e) {
                e.printStackTrace();
            } catch (Exception e) {
                e.printStackTrace();
            }
            
            
        }
      

  17.   


    这样, 就用StringBuffer 再追加啊、 就因该可以啦
      

  18.   


    还的别的办法吗,回头我试下。stringbuffer
      

  19.   

    问题以经解决了,谢谢大家的回复,是写到一个方法里面然后在for里面调用,就可以了,。