我非常清楚即使使用新的 FileAPI 也无法访问使用文件输入字段或拖放添加的文件的本地路径。无论这是好,坏或丑陋不是这里的问题。根据 FileAPI 规范,本地文件访问不会被实现,所以我没有屏住呼吸。
但是让我们假设我处于以下固定参数的情况:
- 开发仅供公司内部使用的 HTML5 应用程序
- .NET 用于后端(需要与 API 互操作)
- 可以准确指定/控制应用程序应使用的浏览器和版本
- 需要访问通常位于网络共享上的文件,但也可能在用户工作站本地访问
并且通过访问我并不是指访问文件数据,而是能够通过向第三方提供文件的本地路径来将文件拖放/选择事件传递给其他 API,以便第三方可以获取文件并对其进行某种处理。这可以比作使用 input[type=file] 字段,就像您在 .NET 中使用 OpenFileDialog 一样 - 即重点是为应用程序提供文件路径,而不是实际文件。
我意识到开箱即用这可能是不可能的。但我也认为这个问题必须有某种解决方案。
我一直在玩弄的一些想法是:
- 使用浏览器特定的方法来允许“安全功能”
- 不确定是否可能 - 厌倦了使用其中一些功能无济于事
- 将应用程序限制为特定版本的浏览器,因为将来可能会删除该功能
- 像 Chrome 扩展这样的东西可能会成功
- 使用本地安装在客户端计算机上的某种配套应用程序,该应用程序负责所有磁盘文件处理,可能使用 websockets 等与 HTML5 客户端通信。
- 一个可能相当混乱的解决方案
- 一开始可能会让用户有点困惑
- 将选定的文件数据提交到服务器,将其存储在特定路径中,并将此新路径发送给第三方。
- 将构成通过公司网络发送的大量文件,大小约为 100+ MB
- 无法对用户选择的文件进行任何就地更改
......就是这样。
有什么时髦的建议吗?明智的话?有用的网址?尖酸的评论?
谢谢。
编辑:对于任何对此感到好奇的人,按照下面 jgauffin 的建议,使用 Silverlight 非常简单。
从 Silverlight 代码隐藏(使用提升的权限):
private void fileBtn_Click(object sender, RoutedEventArgs e)
{
//prompt file select dialog in Silverlight:
var dlg = new OpenFileDialog();
dlg.ShowDialog();
//call JavaScript method and feed it the file path:
HtmlPage.Window.Invoke("onFileSelected", dlg.File.FullName);
}