困扰了我一星期,是关于struts2 用ajax方式调用下载的

amis 2011-01-20 11:16:37
具体情况是这样的,

1.首先读数据库,生成文件在服务器。


2.再用<result name="success" type="stream">做了一个下载功能,下载生成在服务器的文件。已经解决中英文文件名的问题的了。单独调用是正常的


由于生成文件的时候比较长,我想增加用户体验,在查的长时间过程中,在页面弹出一个全屏屏蔽层,层中间再显示个loading的gif。这样的话,前台页面就要知道后台程序时候完成生成文件这个操作了,方便关闭前台显示的loading屏蔽层了。


我有2个思路
1.用ajax方法,ajax有个回调函数,我就知道什么时候关闭loading。但问题是ajax调用<result name="success" type="stream">进行下载的话,下载窗口此终不出来。


2.让strtus2完成后给前台返回一个标志或状态,但下面这2个action并没有返回页面的地方啊。
这个是生成文件的action
<action name="ConvertXML" class="com.struts.action.ConvertXMLAction">
<!-- action间跳转并能提交参数S -->
<result name="success" type="redirectAction">
<param name="actionName">download</param>
<param name="namespace">/</param>
<param name="fileName">${fileName}</param>
</result>
<!-- action间跳转并能提交参数E -->
</action>

这个是下载的action
<action name="download" class="com.struts.action.DownloadAction">
<result name="success" type="stream">
<param name="contentDisposition">attachment;filename="${fileName}"</param>
<param name="inputName">inputStream</param
</result>
</action>





...全文
2334 13 打赏 收藏 转发到动态 举报
写回复
用AI写文章
13 条回复
切换为时间正序
请发表友善的回复…
发表回复
tank_lei 2011-12-18
  • 打赏
  • 举报
回复
哥们,问题解决没有?我也想直接导出成功后,就弹出下载提示框!不用再跳到页面给个超链接,点击才下载
clarck_913 2011-01-24
  • 打赏
  • 举报
回复
[Quote=引用 6 楼 amis 的回复:]

不是这意思,现在不用ajax。struts2是能实现下载的,我只不过想是通过ajax调用这个action而已,实现下载的一样是action的<result name="success" type="stream">,我只是想使用ajax的回调函数
[/Quote]

完全看不懂你这段话是什么意思。

莫寻千百度 2011-01-21
  • 打赏
  • 举报
回复
你这个文件流就是不是有个生成的过程么,,当生成完这个 文件流 也就是在 你的Return 动作前,,out.print 任意一个字符串,,那么 客户端就可以接受到这个字符串, 证明有返回的值 ,就证明 文件流已经生成完毕,那么页面上JS的方法关闭那个层就OK了
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 clarck_913 的回复:]

用户点击要求生成文件时,在Session里放一个标志位,文件生成完毕后,在返回前,把Session里的标志位去掉

页面在用户点击后显示你的那个带动画的框,然后Ajax轮询后台

后台单独写一个Action专门给下载用的,在这个Action的处理方法里,查看Session里的标志位

如果标志位存在,说明文件还在生成,就告诉前台,前台就继续等着

否则认为文件生成完毕,马上就要给……
[/Quote]
clarck_913 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 4 楼 amis 的回复:]
我想解决思路一的问题,如果解决了,就很简单了,直接在回调函数关gif就好了
[/Quote]

这个貌似解决不了,你的Ajax调用获取的是response里的数据,

你怎么用JS在回调函数里把这个数据拼成用户下载的文件?

貌似浏览器的安全机制可以限制JavaScript写本地文件,Ajax的安全机制也不允许你这么做

至少我解决不了,要不你就再问问别人


amis 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 3 楼 clarck_913 的回复:]
用户点击要求生成文件时,在Session里放一个标志位,文件生成完毕后,在返回前,把Session里的标志位去掉

页面在用户点击后显示你的那个带动画的框,然后Ajax轮询后台

后台单独写一个Action专门给下载用的,在这个Action的处理方法里,查看Session里的标志位

如果标志位存在,说明文件还在生成,就告诉前台,前台就继续等着

否则认为文件生成完毕,马上就要给用……
[/Quote]


我想解决思路一的问题,如果解决了,就很简单了,直接在回调函数关gif就好了
clarck_913 2011-01-20
  • 打赏
  • 举报
回复
用户点击要求生成文件时,在Session里放一个标志位,文件生成完毕后,在返回前,把Session里的标志位去掉

页面在用户点击后显示你的那个带动画的框,然后Ajax轮询后台

后台单独写一个Action专门给下载用的,在这个Action的处理方法里,查看Session里的标志位

如果标志位存在,说明文件还在生成,就告诉前台,前台就继续等着

否则认为文件生成完毕,马上就要给用户下载了,把你的那个带动画的框隐藏就OK了

问题是,你知道你做的东西大致的负载程度吗?如果负载大的话,就别玩这么多花活了
amis 2011-01-20
  • 打赏
  • 举报
回复
注,我并不想生成文件后返回下载连接到页面,让用户点击下载,现在是生成完文件直接弹出下载窗口的
行云之云 2011-01-20
  • 打赏
  • 举报
回复
沙发 不熟 盼高手指教 同学习
amis 2011-01-20
  • 打赏
  • 举报
回复
也就是说,strust2返回的,直接是文件流了
amis 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 7 楼 pengzhenonline 的回复:]
首先要把思路理清楚,和 AJAX的工作原理也要搞清楚,,
首先你用AJAX 方法执行 Action 完成生成文件的动作, 返回一个标识符,,
out = response.getWriter();
out.print(标识符) ,标识符可以让客户端接收到,然后关闭Loding 窗口 这个 Action的 Return 动作, 其实就是JSP 的 转发动作,不要为空,地址就是 文件在 服务器的……
[/Quote]

struts2的下载功能,它是这样
return ServletActionContext.getServletContext().getResourceAsStream("/"+fileName);

直接返回InputStream的,我还能转发其它标识吗?
莫寻千百度 2011-01-20
  • 打赏
  • 举报
回复
首先要把思路理清楚,和 AJAX的工作原理也要搞清楚,,
首先你用AJAX 方法执行 Action 完成生成文件的动作, 返回一个标识符,,
out = response.getWriter();
out.print(标识符) ,标识符可以让客户端接收到,然后关闭Loding 窗口 这个 Action的 Return 动作, 其实就是JSP 的 转发动作,不要为空,地址就是 文件在 服务器的 URL ,,然后 客户端才会在 关闭 LoDING动作之后 弹出 下载的窗口,下载刚才生成到服务器的文件
amis 2011-01-20
  • 打赏
  • 举报
回复
[Quote=引用 5 楼 clarck_913 的回复:]
引用 4 楼 amis 的回复:
我想解决思路一的问题,如果解决了,就很简单了,直接在回调函数关gif就好了


这个貌似解决不了,你的Ajax调用获取的是response里的数据,

你怎么用JS在回调函数里把这个数据拼成用户下载的文件?

貌似浏览器的安全机制可以限制JavaScript写本地文件,Ajax的安全机制也不允许你这么做

至少我解决不了,要不你就再问问别人
……
[/Quote]


不是这意思,现在不用ajax。struts2是能实现下载的,我只不过想是通过ajax调用这个action而已,实现下载的一样是action的<result name="success" type="stream">,我只是想使用ajax的回调函数

81,094

社区成员

发帖
与我相关
我的任务
社区描述
Java Web 开发
社区管理员
  • Web 开发社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧