从网页写入本地磁盘

Posted

技术标签:

【中文标题】从网页写入本地磁盘【英文标题】:Write to local disk from web page 【发布时间】:2009-01-05 16:49:45 【问题描述】:

我正在开发一个允许多文件下载的 Silverlight 控件。目前,我正在努力思考浏览器的权限模型。

假设在网页上,用户在文本框中输入本地文件夹 (c:\temp)。然后用户点击一个按钮。

是否可以在 javascript 或 Silverlight 中将一组文件(存储在服务器上)写入用户驱动器上的该文件夹?

【问题讨论】:

【参考方案1】:

来自 Javascript - 没有。如果可能的话,一些人渣在你的电脑上安装病毒太容易了。

Silverlight 我不知道,但我认为写入用户硬盘驱动器会非常有限且受到严格控制。

【讨论】:

这是不正确的。您可以使用 MSIE 中的 ActiveX 或 Firefox 中的类似调用来执行此操作。在这两种情况下,用户都需要“确定”一个对话框,警告浏览器正在请求危险的权限。 澄清一下,您可以在 MSIE 和 Firefox 的 Javascript 中直接调用文件 io。有人已经在此处发布了 MSIE 的链接。对于 Friefox,我没有关于我的详细信息,但它可能与使用 XUL 相同。请参阅此 XUL 示例:captain.at/programming/xul 此时(除了下面有正确答案的事实之外)文件 io 正在直接构建到 html5 中,但我们仍然有错误的答案,投票数是其他答案的两倍。哦人类ಠ_ಠ 可以使用File System Access API覆盖本地文件,但只能修改用户选择的文件。【参考方案2】:

仅当浏览器存在您可以利用的安全漏洞时。

由于您描述的功能将允许任何网页为访问者的系统做任何该死的事情,因此在当今时代,任何人都不会故意对本地磁盘进行任意访问。

您可以做的下一个最好的事情是让用户下载一个 ZIP 存档并告诉他在任何他喜欢的地方解压缩。

【讨论】:

【参考方案3】:

您不能来自 Silverlight。您唯一可以访问的是独立存储。

http://blog.paranoidferret.com/index.php/2007/10/12/silverlight-tutorial-using-isolated-storage/

http://msdn.microsoft.com/en-us/library/bdts8hk0.aspx

【讨论】:

【参考方案4】:

警告:这些答案大多不正确。

可以在 MSIE(使用 ActiveX FileSystemObject)和 Firefox(使用 nsIFileOutputStream)中通过 Javascript 写入文件。在这两种情况下,用户都会看到一个安全对话,可以允许或拒绝读取或写入。

【讨论】:

【参考方案5】:

我已使用 Scripting.FileSystemObject 来执行此操作。只能在 IE 中使用,并且只能在非常宽松和不安全的安全设置下使用,但它可能适用于企业的 Intranet 站点,至少它对我有用。

【讨论】:

【参考方案6】:

Google Gears 有一种方法来进行客户端存储。

http://gears.google.com/

也就是说,我怀疑它会做你正在尝试的事情。我认为您最好让服务器端的东西下载文件并将它们放入客户端的 .zip 文件中,然后再将其传递给它们。

【讨论】:

【参考方案7】:

正如之前回答的那样,这必须通过服务器端完成,Silverlight 和 JavaScript 被沙盒化以禁用这种类型的安全漏洞。我建议将文件打包到服务器上的 zip 存档中,然后下载 zip 存档。

【讨论】:

【参考方案8】:

您可以通过 ActiveX 控件或 Java 小程序执行此操作。无论采用哪种方式,项目都必须使用代码签名证书进行签名。您可以使用自签名证书,但警告对话框会更响亮。

然后您可以使用 Javascript 调用已签名的控件并保存文件。在创建这样的小程序时要非常小心。您不想让任何其他网站使用此控件,因此该控件必须实现以下某些功能:

    仅适用于特定网站。 仅将文件保存在特定位置。 提示用户保存文件的位置,以便他们知道正在发生这种情况,并且不会在后台静默发生。

您可能会在某个地方找到可以用 Javascript 控制的控件或小程序。

【讨论】:

【参考方案9】:

我不相信这是可能的,因为它会产生无数的安全问题。我认为这是安全的唯一方法是混合用户权限和某种方式(在客户端)验证网站的真实性以及他们想要下载到我的计算机的文件。

您可以做的一种方法是触发“FileSaveDialog”,但我认为这不是您想要的。也许先打包文件集合然后触发是实现目标的方法。 Silverlight 仅允许每个域 1mb 的隔离存储,并且绝对不会让网站访问客户端硬盘。

【讨论】:

【参考方案10】:

这并不能直接回答问题,但 Adob​​e Flex 4 允许使用 FileReference 类进行此操作。

【讨论】:

【参考方案11】:

Silverlight 4 OOB 允许访问用户的文档目录。

【讨论】:

以上是关于从网页写入本地磁盘的主要内容,如果未能解决你的问题,请参考以下文章

错误日志写入到本地磁盘(lock 队列)

如何在网页中得到本地磁盘上的文件列表

当运行时修改写入名称节点中的编辑日志文件时,编辑日志文件是在 RAM 还是本地磁盘上更新

写入视频文件并同时播放

为啥 Spark 将 Map 阶段输出保存到本地磁盘?

我使用 .net core webapi 怎么获取图片并存到本地磁盘去