从文件夹和子文件夹上传文件到Web应用程序

7
目标: 允许用户选择文件夹,然后递归查找所有匹配文件模式的文件并将其传输(POST)到我的 Web 服务器 本质上只是一个更高级的上传对话框......
标准的 Web 技术(我们正在使用 plupload)不支持此功能,因为出于安全原因,据我所知。
额外的要求: 易于从 Web 应用程序中使用/安装。需要 SSL 和应用程序用户凭据。一些其他数据,例如记录 ID(从 Web 应用程序获取或创建),以关联上传文件,将是不错的。
Web 应用程序本身是用 Ruby on Rails 编写的,但如果我需要一些本地的 Mac 和 Windows(=80% 的用户) 桌面客户端,这并不重要。
我的选择是什么?
提供此功能的开源库的代码和参考资料都是额外的奖励。

递归查找所有与文件模式匹配的文件。比如,您是否尝试从文件夹中上传所有png文件(但可能不包括jpg文件)?您实际上要处理什么? - whitehat101
  1. 正确。
  2. 你的意思是什么,文件类型是什么?*.dcm。
- oma
3个回答

4
我建议创建一个Adobe Air应用程序。您可以重用现有的plupload js代码,并使用adobe air apis进行扩展。理想情况下,这将是一个大部分静态的应用程序,但会发出服务器调用以创建策略文档,并在上传时执行任何想要执行的记录操作。请查看从JavaScript访问AIR API类。然后查看filesystem.File类。Flash有类似于99.3%的渗透率,并且用户只需点击“安装我的上传器”,如果需要,air框架就会自动安装。Air还在Android和iDevices上,因此您的应用程序可能会对99.999%的用户及其母亲可用。我花了一分钟找到它,但这里是Adobe® AIR® HTML开发人员API参考。哦,看看我在他们的示例中发现了什么:
var directory = air.File.documentsDirectory;

try
{
    directory.browseForDirectory("Select Directory");
    directory.addEventListener(air.Event.SELECT, directorySelected);
}
catch (error)
{
    air.trace("Failed:", error.message)
}

function directorySelected(event) 
{
    directory = event.target ;
    var files = directory.getDirectoryListing();
    for(var i = 0; i < files.length; i++)
    {
        air.trace(files[i].name);
    }
}

1

这对于普通用户不起作用。Ruby并不一定被安装,也不能将S3凭据提供给公众。本质上,我只需要一个更高级的上传对话框。 - oma

0
我仍然认为Adobe Air应用程序是解决您问题的可靠方案。它提供了简单的安装/更新,支持SSL,允许您完全控制用户体验,110%跨平台等等... 但是,如果您不喜欢Adobe或编写UI代码,您是否考虑过WebDav / dav4rack gem?

https://github.com/bryanrite/dav4rack-example-devise-subdirectories

那个GitHub示例在Rails应用程序中使用devise进行身份验证,并使用相同的凭据让用户访问私有存储桶,用户可以通过任何WebDav客户端上传文件。您的Web应用程序可以提供包含用户名的链接,以使访问更加方便。

OS X的Finder通过Finder的“连接到服务器”对话框本地支持WebDav(自10.1.1以来)。

如果您的用户使用Linux,我相信他们可以弄清楚WebDav。

从扫描http://en.wikipedia.org/wiki/WebDAV来看,Windows似乎在Win98中支持WebDav。但是,与其他所有Web标准一样,微软决定要有所创新。听起来,如果用户更新了KB892211、KB907306、Office、Internet Explorer、OLE-DB和/或“Microsoft Update for Web Folders”,他们应该能够轻松地使用各种身份验证方案通过SSL访问WebDav文件夹。我相信您的所有Windows用户都在使用最新更新和完整的Office套件的正版Windows。

由于您的Rails应用程序是WebDav服务器,因此您将能够抛出错误(无法将文件写入服务器),后处理上传的文件/目录,并进行任何您需要的簿记(您拥有用户帐户以及他们上传的内容)。Dav4rack非常不错。您可以使用实际的文件系统作为后端,或者数据库,或者将上传的文件反弹到S3,或者几乎可以在Ruby中做任何事情。

我认为这个解决方案可能无法像Air应用程序那样很好地解决“递归查找所有匹配文件模式的文件”组件。没有真正的实际经验,我想象模式匹配将在上传完成后发生(可能会导致带宽效率低下)。


你真的很想得到这个赏金,Jeremy,哈哈。不过我还不确定我对 WedDav 的看法,但还是谢谢你分享。当一个问题对我非常重要时,我会添加赏金以尝试获得尽可能多的角度。你将因 Adobe AIR 答案而获得它。再次感谢。 - oma
我的公司一直在考虑上传工具。我已经制作了其中一个Rails应用程序,可以直接推送到S3(不是Air应用程序),但结果发现出现了很多问题。我们最终解决了这些问题,但只能使用Silverlight。Flash无法上传进度,还有一些文件损坏的问题。HTML5失败了,HTML4在没有进度的情况下也有点工作,我认为它需要自定义标头。现在,我几乎感觉直接上传到S3还不准备好投入生产。我一直在考虑重新设计并构建更多的Air应用程序,但对我来说,这已经是下一个项目了! - whitehat101

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