我们有以下要求: 我们网站的用户应该能够将手持扫描仪的数据上传到我们的网站。
扫描仪映射到PC上的本地驱动器。编写.NET程序并从其设备访问该文件并将这些文件发送到Web服务非常容易。
我们的用户希望直接从网页上获取此信息。他们点击了一个按钮,一个组件(网站)从设备读取数据并将其发送到服务器。
我知道这些技术应该可行: * Java applet * Microsoft Silverlight *编写一个富客户端程序,将其发送到我们的Web服务(用户希望远离它)
他们两个看起来都不太吸引人(反正Silverlight死了吗?),所以我想知道是否还有其他技术可用于从网页访问客户端上的本地文件?
答案 0 :(得分:3)
这是一个反复出现的问题。我已经尝试了上面提到的一些替代方案,或多或少地做了工作。
对我来说,作为Java开发人员使用JavaFX applet似乎是最好的选择。我所做的不是创建一个仍然如此沉重且难以与网页设计集成的可视化小程序。但我改为创建了一个导出javascript特权函数的1px applet。 http://docs.oracle.com/javase/tutorial/deployment/applet/invokingAppletMethodsFromJavaScript.html
无论如何,你必须使用有效的CA签署applet,即使这样你仍然会遇到一些用户的问题,因为java没有更新,安装了jre 32bits但是使用了64位浏览器,一些防病毒产生applet故障等等令人讨厌的消息。 ..
此外,您可以使用此框架为firefox,chrome和IE http://www.firebreath.org/display/documentation/FireBreath+Home创建插件。对于用户来说,安装几乎是透明的,除了安装浏览器之外,不需要任何其他内容。缺点是您需要在C ++中实现它,因此您需要跨平台插件,当然您需要为每个要支持的操作系统编译一个版本。 Firebreath提供了一些在专业SO中支持的公共API。
在某些(并非所有)情况下有用的其他选项:您可以创建可以执行特权工作的系统托盘桌面应用程序。该应用程序可以启动在localhost界面中绑定的小型Web服务器,浏览器可以使用跨域ajax调用与系统托盘应用程序进行通信,并向Web应用程序发送指令和更新。
无论如何要谨慎地实施这种解决方案,需要付出一点努力才能为用户提供良好的体验。
答案 1 :(得分:1)
由于您似乎对最终用户的环境有足够的控制能力,并且能够让他们在桌面上安装软件,因此我会考虑注册一个调用.NET可执行文件来执行工作的自定义HTTP方案。使用几个注册表项注册custom URI scheme相对简单。如果您在该文章的示例中注册为open / command,则浏览器将调用您注册的.EXE,其余的URL作为命令行参数,然后您的程序可以执行该工作。
这种机制的一个好处是它可以在主流浏览器上运行而无需编写特定于浏览器的代码(插件等)。从您的角度来看,这有点令人费解,因为您将让用户调用外部程序让它完成工作,然后你需要检测你的页面(ajax回到你的服务器?)工作完成,并允许用户继续前进。但是因为您可以通过自定义URI将大量数据传递给您的程序,所以假设他们安装了自定义方案处理程序,该过程可以“感觉”与最终用户相对无缝,并且不需要太多额外的交互。
然而,缺点是(据我所知)检测您的URI方案处理程序是否安装在最终用户的系统上并不是简单的跨浏览器方式来自您的Web应用程序。如果您在服务器端检测到帮助应用程序尚未启动且无法正常工作,则可能必须让调用失败并弹出安装说明。
尽管这并不完美,但我的经验是签名的java applet越来越难以运行最终用户。浏览器供应商正在阻止Java或旧版本的Java,或者创建大量安全警告,或者Sun正在更改规则并要求您向.JAR清单添加内容,或者热心的防火墙只是在网络上完全阻止已签名的.JAR因为它们可能是恶意软件等,所以你会发现如果你走Java路线就很麻烦。
答案 2 :(得分:0)
JavaFX是某种Java Applet的下一步(或步骤),它可能会有所帮助。 Here是官方JavaFX概述。
答案 3 :(得分:0)
出于安全/隐私原因,不允许Webapps访问客户端的文件系统。用户是必须启动文件传输(上传)的用户。
HTML5 File API也无法使用,因为您的网络应用只能在自己的sandbox内播放。
Mozilla Firefox add-on可能会这样做,但您的用户必须使用Firefox。我不知道Google Chrome扩展程序是否可以执行此操作。
唯一与浏览器兼容的方式已签名的小程序 - 这些用于eBanking webapps以访问例如来自CD / USB的用户数字证书。
答案 4 :(得分:0)
Chrome上的一个替代方案是开发一个Native Messaging应用或扩展程序,通过stdin和stdout与用户计算机上的本机应用程序进行通信。