2010-06-10 80 views
14

我需要向请求文件下载的用户显示进度条。我正在使用J2EE应用程序来生成文件。用户将提交表单数据以获取文件。服务器将所有提交的数据操作,生成并发送一个PDF文件回客户端。从服务器下载文件时显示进度条

所以我想向用户显示一个进度条,直到文件进入客户端。 有没有办法做到这一点?

+1

我很想知道如何做到这一点 – 2010-06-10 06:02:49

+0

生成文件通常需要多长时间? – cherouvim 2010-06-10 06:20:36

+0

@cherouvim:这里的时间不是一个静态的。它在文件到文件之间有所不同。最短时间为1秒,最长为20-30分钟。 – 2010-06-10 06:29:53

回答

9

如果我理解你的话,你想显示一个进度条,直到你的服务器准备好发送一个文件,而不是显示下载文件的进度。

如果那是真的,那么你正在处理一个艰难的练习。一个可靠的进度条需要知道(非常确切)你在做什么以及需要多长时间。在你的情况下,有很多不可靠的因素(其中一个,也许最大的是网络本身)。

因此大多数开发人员使用某种“无尽的”动画来显示“正在进行的工作”。

更新

基于您的评论,显示“正在进行的工作”最简单的方法动画看起来像

$.ajax({ 
    url:  "/myscripts/myserverscript", 
    type:  "POST", 
    data:  { 
     foo: "bar" 
    }, 
    dataType: "text", 
    beforeSend: function(xhr){ 
     // display a progress animation 
    }, 
    complete: function(xhr, status){ 
     // hide the animation 
    } 
    ... 
}); 

在一个单一的请求的情况下。您还可以为(.ajaxStart().ajaxStop())设置全局ajax事件处理程序来设置显示/隐藏功能。

参考文献:.ajax().ajaxStart(),用于服务器端文件生成.ajaxStop()

+0

任何一种情况都是有效的。知道正在下载的文件的进度将是一件好事。或者,在服务器准备好发送文件之前,我仍然可以看到正在进行的工作。 – 2010-06-10 06:27:45

+0

感谢您的回复。 – 2010-06-10 06:57:01

+1

+1为简单的“无限等待” – cherouvim 2010-06-10 07:13:55

3

进度条:

假设我们的服务器需要多少秒生成文件。此事件由原始请求(阻止操作)触发。当这完成时,该文件将被生成并且将被发回给客户端。

同时,您希望通过其他请求(ajax)调用服务器并获取当前为特定用户生成的文件返回的百分比。

胶这里部分是:

  • 当原始请求被产生,它需要存储在频繁的时间间隔的进度(即,每10%)的文件。将这些数据存储在http会话中可以正常工作。
  • 其他请求(ajax)只需要能够将这些信息从http会话中取出即可,http会话中的同步(序列化访问)是一些Web应用程序通常做的事情,这是不可能的,因为其他请求(ajax)会阻止,直到原始请求在客户端完成
  • 它都是html + javascript以提供您需要的交互(动画进度条)。即使间隔非常粗糙(从10%跳到20%到30%),您可以使用jQuery为条形设置动画。我曾经做过一次,看起来很棒。

文件下载进度条:

最好还是离开这个浏览器的原生对话框。

+0

我可以知道如何从html/java-script获取文件下载信息吗?你能分享一些关于你说的最后一点的更多信息吗(在客户端,这都是......)? – 2010-06-10 06:39:46

+0

在服务器端,您需要提供此信息的URL(例如Java servlet)(只需从http会话中打印百分比)。这将是纯文本(例如“20%”)还是JSON或XML取决于您以及您将如何实现客户端。在客户端,您将通过jQuery对URL进行异步请求,以便获取此信息并相应地修改DOM。这些请求需要通过javascript函数每隔X秒(比如3秒)触发setTimeout(..) – cherouvim 2010-06-10 06:47:51

+0

对于这种方法,我真的会建议某种COMET方式,而不是本地ajax请求。 – jAndy 2010-06-10 06:51:59

0

在Java中,您只是围绕输入流包装了一个javax.swing.ProgressMonitorInputStream,但请注意,除非服务器以分块流模式发送,否则显示屏并不会真正表示任何内容,因为整个响应将被读取在将第一个字节传递给Java之前将其存储到内存中。