在用户在页面中有一系列的操作如,1.点击上传文件按钮上传文件->>2.jsp页面中显示文件的信息->>3.点击确定把相关数据写入数据库.考虑到多用户的环境中,可能有多个用户对同一文件进行上传所以加入一个控制(在一个单例的对象中维护一个list,里面存放正在进行上传的文件名,如果存在则不容许上传,相关方法如增加,删除也加入了synchronized)。现在编写的代码已经大致写出来,但存在一种情况不知道如何处理,当进行到第二步(显示文件信息)时,该页面中有一确定按钮,用户点击该按钮就执行第三步的操作,问题就出在这里了,如果用户不点击该按钮直接退出浏览器或跳转到别的页面中那么在单例的对象中就无法清除对应的文件名,也就无法保证用户的一系列操作的原子性了,但该用户(或别的用户)接着回来重新上传时在第一步就会被拦截,请问有什么好的方法解决呢。ps:我用的是struts1.x

解决方案 »

  1.   

    1. 都可以上传
    2. 上传完毕后 对 文件 fileA 进行除重。 比如 md5 与已经有的文件比较。
    3. 若跟已有文件fileB重复,删除当前文件fileA
    4. 文件链接 指向 fileB——————————————————————————————
    参考qq网络文件夹
      

  2.   

    增加一个Timer来维护这个正在上传的文件列表,设置一个超时时间,比如说5分钟,也就是说在这个缓存列表中5分钟都还没被确定,那就删除这个文件和相应的记录。这样,浏览器直接关掉服务器也照样维护。以下特殊情况:如果用户关掉浏览器,过2分钟又重新登录,那应该还让他传刚才没确定的那个文件,这时的做法可以在正在上传文件列表中加入上传用户的标识,比如用户ID。如果此系统上传文件不需要登录,那就没法这样做。
      

  3.   


    这个不错的建议,但我想了下最后还是用监听器还有页面的javascript做控制实现了,谢过了!!