我发现,eyou的邮箱系统具有的网络存储功能,上传文件时,会开启一个自动刷新的页面,应该是凭借这个页面的刷新同服务器端通信,保证连接的有效性,以实现大文件的上传。不知道大家什么想法?有没有更实际的解决方案或伪代码、代码?欢迎讨论,顶者有分

解决方案 »

  1.   

    1 从协议上讲,一旦数据开始传输到服务器,连接就将一直有效,不会无故的断掉
    2 那个刷新页面,主要是因为我们上传速度太慢了,时间太长,session已经超时,造成虽然你前面upload页面成功,但其它页面你不能使用了,需要再次登陆。也就没有意义了。3 Ajax可以更简单些。 prototype 的 PeriodUpdate 可以定时的调用服务器的页面,来保证session的有效性。
      

  2.   

    请问java2000_net ,能否详细一点?谢谢!
      

  3.   

    1 上传提交的时候,先open一个窗口用于刷新啦
    2 新窗口调用
    new Ajax.PeriodUpdater(......具体的使用,去查 prototype 的手册吧!www.prototypejs.org
      

  4.   

    好像听说用Ajax比较好点,我没有试过
      

  5.   

    没有看过你说的那个系统,新开一个窗口间隔的刷新,一来可以保持session,二来可以刷新进度条(如果有进度条)。
      

  6.   

    我用webwork实现过。使用的是Jakarta的文件上传组建。
    实现它的ProgressListenner后,可以获取上传进度。public class FileUploadListener implements ProgressListener{
       ...
       private HtttpSession session;
       public FileUploadListener(HttpServletRequest servletRequest){
          super();
          this.session = servletRequest.getSession(); 
       }
       public void update(long pBytesRead,long pContentLength,int pItems){
          ...
          FileUploadMessage message = (FileUploadMessage)session.getAttribute("FileUploadMessage");
          if(message == null)sesion.setAttribute("FileUploadMessage",new FileUploadMessage(pItems,pContentLength,pBytesRead));
          else{
               message.setItem(pItems);
               message.setReaded(pBytesRead);
               message.setTotal(pContentLength);
               ...
          }
       }
    }在JakataMultiPartRequest中加入Listener:   ...
       ServletFileUpload upload = new ServeltFileUpload(fac);
       if(upload.getProgressListener()== null)
              upload.setProgressListener(new FileUploadListerner(servletRequest));
      ...这样,就在jakarta的文件上传组建中植入了一个钩子,可以从session中得到文件上传进度。
    在action中需要两个方法,一个方法获取上传文件,一个获取文件上传进度。
    客户端,用iframe提交form.提交后,不断ajax请求上传进度(同时也起到了保持session有效的作用)。
    大致就是这样的。