使用Ruby/Sinatra/Haml/Passenger/nginx,最简单的获取嵌入式上传进度条的方法是什么?

3
我有一个网站,人们可以上传超过30MB的数据,我希望能够在上传过程中向他们展示进度,而不会导致网页失去响应,类似于Gmail中的Flash上传。这里有一个问题(链接),但我不知道那个进度条是嵌入在页面中还是使用浏览器的进度条。我也是一个网站新手,所以不确定它是否是“最简单”的方法。我问了swfupload的人如何做到这一点(链接),得到的答案是“这个工具需要一些使用知识”,没有给我提供很多帮助来找出从哪里开始。我还在ServerFault(链接)上问了这个问题,但没有得到回复,也许那不是正确的地方。
我非常支持学习新事物等,但这里有很多潜在的路径可供选择。我应该从哪里开始,需要了解哪些内容才能确保sinatra、haml、ruby、passenger和nginx的协同工作呢?
谢谢!
2个回答

4
最简单的解决方案可能是Flash,但它也是最丑陋的:正如SWFUpload论坛上的一些人告诉你的那样,Linux上的Flash支持有点糟糕,而且总的来说,如果可以的话,应该避免使用它。
因此,下一个解决方案是在客户端使用服务器端模块+Javascript的组合。
请注意,我已经在ServerFault上部分回答了你的问题。
为了简单起见,建议您切换到Apache或Lighttpd。
服务器端模块(apache upload progress module/lighttpd mod_uploadprogress)处理文件上传,并公开一个API,您可以在Javascript中查询当前进度。
在客户端,您有两个选项(如文件上传器库所示,除非您还想修改服务器端模块,否则不应使用):
  • 较新的浏览器允许您在AJAX调用中执行和监视上传(请参见此处

  • 几乎所有浏览器,无论新旧,都允许您在表单中执行上传,并通过“IFrame技巧”使用AJAX进行监视:由于当前正在运行的文件上传会阻止Javascript代码运行(从而禁止您查询服务器并更新进度条),因此您需要在上传页面中包含一个隐藏的IFrame,并将表单的操作设置为该IFrame。这样,“主页面”的Javascript代码可以在上传仍在进行时执行。

针对客户端Javascript,你可以自己编写或者使用现有的库(请看这里)。你的目标是查询服务器上文件的进度并将其显示出来。想要漂亮的进度条,请查看jqueryUI
最后,你可以查看我的代码,我解决了同样的问题,使用了Ruby/Sinatra/Haml/Passenger/Apache。
希望能帮到你。

哇,谢谢!我们曾经认为这个项目行不通,因此将其搁置,并转而采用Java / jnlp解决方案。问题是,一些客户的机器上不允许安装Java(我知道,对吧?),所以我们必须重新考虑这个问题。 - mmr
完成。这里还有更多的字符,因为“完成”太短了。 - mmr

0
据我所知,你无法仅使用HTML/JavaScript来实现。你必须使用一些Flash、Java或其他相关技术。Swfupload是一个不错的选择 - 它可以提供你所需的功能(我看到它在工作),但我现在无法回忆起具体细节。

很高兴听到这个消息!你建议的库目前还不适合生产环境,至少在我看来是这样的(它非常新鲜,评论中指出了许多问题,多个文件同时上传而无法排队,只能在非常有限的浏览器集合中正常工作),但它有很大的机会在不久的将来成为非常好的东西。 - skalee
是的,实际上开发者已经转向了一个新的实现(http://github.com/valums/file-uploader),它对于最近的浏览器只使用XHR,而对于旧版本则使用常规的iframe技巧。然而,它似乎与已有的服务器模块兼容性较低。 - asymmetric

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接