为什么 Firefox 没有文件系统 API?

我经常被问到的一个问题是,为什么 Firefox 不支持文件系统 API。通常,但并不总是,他们特别指的是 FileSystemFileWriter 规范,Google 在 Chrome 中实现了这些规范,并已提议在 W3C 中进行标准化。

答案有些复杂,很大程度上取决于人们实际想要使用上述两个规范的哪些具体功能。这些规范相当庞大,功能齐全,因此人们想要用它做很多不同的事情并不令人惊讶。这篇博文试图给出我对此问题的答案,并解释为什么我们没有实现上述两个规范。但请注意,这篇博文代表我个人的观点,旨在引发更多关于此主题的讨论。

如上所述,在 Firefox 中要求“文件系统 API 支持”的人实际上往往对解决许多不同的问题感兴趣。我认为大多数,但到目前为止还不是全部,这些问题都有比文件系统 API 更好的解决方案。因此,让我在下面逐步介绍它们。

本地存储资源

可能最常见的用途是简单地存储一组资源,以便它们可以离线使用,而无需使用网络。如果您需要快速访问这些资源,或者即使用户离线也可以访问它们,这将非常有用。游戏是需要此功能的非常常见的应用程序类型。例如,一艘敌人的宇宙飞船可能与一些相关的图像以及一些相关的音频相关联,这些音频在敌人四处移动并射击时使用。今天,人们通常通过将图像和音频文件存储在文件系统中,然后将这些文件的名称与敌人的速度和火力等信息一起存储来解决这个问题。

但是,在我看来,将一些数据与其他数据分开存储似乎不是最佳的方案。尤其是在存在可以同时存储结构化数据和文件数据的解决方案的情况下。IndexedDB 将文件数据视为任何其他类型的数据。您可以将 FileBlob 写入 IndexedDB,就像您可以存储字符串、数字和 JavaScript 对象一样。这是由 IndexedDB 规范规定的,到目前为止已在 Firefox 和 IE 的 IndexedDB 实现中实现。使用这种方式,您可以将所有需要的信息存储在一个地方,并且对 IndexedDB 的单个查询可以返回您需要的所有数据。例如,如果您正在构建一个基于 Web 的电子邮件客户端,您可以存储类似以下的对象:

{
  subject: "Hi there",
  body: "Hi Sven,\nHow are you doing...",
  attachments: [blob1, blob2, blob3]
}

这里另一个优势是,无需为资源创建文件名。只需存储 FileBlob 对象即可。无需名称。

在 Firefox 的 IndexedDB 实现中(我相信 IE 的实现也是如此),文件是透明地存储在实际数据库之外的。这意味着将文件存储在 IndexedDB 中的性能与将文件存储在文件系统中一样好。它不会使数据库本身膨胀从而减慢其他操作的速度,从文件中读取意味着实现只会从操作系统文件读取,因此它与文件系统一样快。

Firefox IndexedDB 实现甚至足够智能,如果您在 IndexedDB 数据库中存储了多个文件的同一个 Blob,它只会创建该文件的一个副本。对同一个 Blob 的进一步引用只会增加一个内部引用计数。这对网页来说是完全透明的,它唯一会注意到的就是更快的写入速度和更少的资源使用。但是,我不确定 IE 是否也这样做,因此在依赖它之前请先检查一下。

访问图片和音乐文件夹

人们询问与文件系统 API 相关的第二件事是能够访问用户的图片或音乐库等内容。这是提交给 W3C 的文件系统 API 实际上没有提供的功能,尽管许多人似乎认为它确实提供了。为了满足这种用例,我们拥有 设备存储 API。此 API 允许对“用户文件”进行完整的文件系统功能。即,不是特定于网站的文件,而是由用户管理和拥有的资源,用户可能希望通过多个应用程序访问这些资源。例如照片和音乐。设备存储 API 基本上是一个简单文件系统 API,主要针对这些类型的文件进行了优化。

我们仍在指定和实现此 API。它可以在最新的 nightly 版本中进行测试,但到目前为止尚未默认启用。向 Web 公开此功能的主要问题是安全性。您不希望任何网站读取或修改您的图像。我们可以像使用 GeoLocation API 一样弹出一个提示,考虑到此 API 可能会删除您过去十年来的所有图片,我们可能想要更多。这是我们正在积极努力的事情。但在这里,安全性绝对是难点,而不是实现低级文件操作。

低级文件操作

一个不太常见的请求是能够进行低级创建、读取、更新和删除 (CRUD) 文件操作。例如,能够在 10MB 文件的中间写入 10 个字节。这不是 IndexedDB 目前支持的功能,它只允许添加和删除整个文件。FileWriter 规范草案支持这一点。但是,我认为此 API 的这部分存在一些非常基本的问题。具体来说,它没有锁定功能,因此无法执行多个文件操作并确保另一个选项卡没有在这些操作之间修改或读取文件。也没有办法进行 fsync,这意味着您无法在 FileWriter 之上实现 ACID 类型应用程序,例如数据库。

相反,我们创建了一个具有相同目标的 API,但它具有锁定文件和执行多个操作的功能。这以一种方式完成,以确保没有页面忘记解锁文件或出现死锁的风险。该 API 还允许 fsync 操作,这应该能够在 FileHandle 之上实现像数据库这样的东西。但最重要的是,该 API 的设计方式可以确保您不必像使用 FileWriter 那样嵌套异步回调。换句话说,它应该更容易让作者使用。您可以在以下位置了解更多关于 FileHandle 的信息:

https://wiki.mozilla.org/WebAPI/FileHandleAPI

filesystem URL 方案

文件系统 API 中还存在一种上述未涵盖的功能。该规范引入了一种新的 filesystem: URL 方案。从 filesystem: 加载 URL 时,它会返回使用文件系统 API 存储的文件的内容。这对于几个原因来说是一个非常酷的功能。首先,这些 URL 是可预测的。将文件存储在文件系统中后,您始终知道可以使用哪个 URL 从中加载。并且只要文件存储在文件系统中,即使网页重新加载,该 URL 也会继续工作。其次,相对 URL 与 filesystem: 方案一起使用。因此,您可以从存储在文件系统中的一个资源创建指向存储在文件系统中的另一个资源的 链接。

Firefox 支持 blob: URL 方案,它允许在可以使用 URL 的任何地方从 Blob 加载数据。但是它没有上述功能。这是我真正想找到解决方案的地方。如果我们找不到更好的解决方案,那么实现 Google 规范绝对是一个选择。

结论

与往常一样,在讨论要添加到 Web 平台的功能时,重要的是讨论用例和功能,而不是直接跳到特定的解决方案。文件系统 API 旨在解决的大多数用例都可以通过其他方式解决。我认为,很多时候是通过更好的方式。

这就是为什么我们没有优先考虑实现文件系统 API,而是专注于让我们的 IndexedDB 实现变得出色,并想出一个用于低级文件操作的良好 API。

专注于 IndexedDB 也意味着我们很快将在 3 个浏览器中提供一个用于基本文件存储的良好 API:IE10、Firefox 和 Chrome。

相关的是,我们刚刚修复了 IndexedDB 实现中最后一个已知的规范合规性问题,因此 Firefox 16 将以非前缀形式发布 IndexedDB!

与往常一样,我们非常乐意收到其他人的反馈,尤其是来自 Web 开发者的反馈。您认为我们是否应该优先考虑文件系统 API?如果是,为什么?

关于 Jonas Sicking

Jonas 在 Web 浏览器领域从事开发工作已超过十年。他从 2000 年开始作为开源贡献者,为新开源的 Mozilla 项目做贡献。2005 年,他全职加入 Mozilla,此后一直在从事 DOM 和 Web 平台的其他部分的开发工作。他现在是 Mozilla Web API 项目的技术主管,也是 W3C IndexedDB 和文件 API 规范的编辑。

Jonas Sicking 的更多文章…


117 条评论

  1. Neel Mehta

    很棒的看法,Robert。我同意,出于安全考虑,文件系统 API 不应该添加 - 至少现在不应该。始终存在应用程序声称可以找到您计算机上所有猫咪的照片,但实际上在您授予访问权限后会删除您过去十年的所有照片的情况。

    2012 年 7 月 5 日 下午 1:41

    1. Devon Govett

      您误解了文件系统 API。它在其当前形式下不会访问用户系统上的任何文件。它是一个沙箱文件系统,这意味着它只能访问它最初写入沙箱内的文件,而不是任何文件。这方面没有任何安全问题。明白了吗?

      2012 年 7 月 5 日 下午 1:45

      1. Jonas Sicking

        的确如此。Google 提出的并在 Chrome 中实现的文件系统 API 不会公开访问用户文件。

        正如我上面所说,我将其包含在这篇博文中的原因是,许多人都在请求该功能,并认为实现文件系统 API 会让他们获得该功能。

        这篇博文旨在使事情更加清晰,尽管显然我并没有成功地向每个人说明这一点 :-)

        2012 年 7 月 5 日 下午 1:53

  2. Marat Denenberg

    我真正想要的是能够生成数据,并向用户提供一个提示,让他们将数据保存到文件中,就像从服务器下载数据一样。就像 PDF 或 CSV 文件一样,完全使用 JavaScript 在客户端生成。

    可以使用数据 URI 来实现这一点,但这真的很笨拙,建议的文件名是随机的,没有适当的扩展名。

    似乎可以很容易地解决。

    2012 年 7 月 5 日 下午 1:50

    1. Devon Govett

      我在 https://github.com/devongovett/standards/issues/3 提出了一个关于此类 API 的建议,我非常乐意收到反馈。我希望很快就能向标准机构和邮件列表提交此类 API 的请求。这绝对是我想要解决的问题,尽管目前的 FileSystem API 关注的是不同的用例。

      2012 年 7 月 5 日 下午 2:01

    2. Jonas Sicking

      FileSaver API 旨在满足这种用例。我完全同意,我们应该实现它。

      2012 年 7 月 5 日 下午 2:23

      1. Robert Kaiser

        Jonas,如果 Bugzilla 中有关于允许我们执行此操作的 API 的错误,请告诉我,我想跟踪它。
        从我的角度来看,理想情况下,它应该允许 Web 应用程序建议一个文件名,并提示用户选择要保存文件的位置和文件名(但这可能取决于是否静默保存下载文件的首选项)。然后它会告诉 Web 应用程序实际使用的文件名(出于隐私原因,不是完整的本地路径),并允许它以某种方式直接写入该文件。像我们现在必须做的那样,将数据 URI 作为长字符串组装起来,真的很丑陋。

        2012 年 7 月 5 日 下午 3:47

      2. Devon Govett

        Jonas,

        FileSaver 有一些严重的限制,我在我的建议中提到了这些限制。例如,似乎必须将整个 Blob 放入内存中才能写入文件 - 无法像文件系统规范中的 FileWriter 那样异步地以块的形式进行流式写入,而这对于大型文件来说至关重要。

        对于现有文件,也没有写入权限的概念。用户不应该在每次需要保存文件时都出现一个另存为对话框。他们应该能够打开文件,对其进行更改,并将更改保存回同一个文件,而不必再次选择它(当然,他们必须至少授予一次写入权限)。请参阅我的建议以了解有关此方面的详细信息,并告诉我你的想法。

        谢谢!

        2012 年 7 月 5 日 下午 4:16

  3. Devon Govett

    Robert,我很高兴你花时间写这篇文章,并从开发人员那里获得反馈!以下是我的一些想法。

    FileSystem API 真的很好,因为它可以很容易地将服务器上的文件结构在本地复制。例如,你可以向服务器发出请求,让服务器压缩一些资源,将压缩文件发送下来,并将其扩展到本地的相同目录结构中。这样,当你应用程序离线时,就可以很容易地使用文件系统链接来代替指向服务器的普通 URL。

    文件还包含元数据,例如最后修改日期、文件大小等。FileSystem API 可以让你访问这些信息,这将使与服务器的双向同步更加容易。想象一下一个将文件存储在 FileSystem API 中并与服务器同步的文字处理应用程序。用户可以拥有文件夹等,FileSystem API 将使这些文件更容易与服务器进行双向同步,其中包含每个文件的元数据,以及服务器文件结构的精确副本。

    你可以使用 IndexedDB 来模拟这种功能,将元数据和文件路径存储为附加键,但这有点蹩脚,因为我们本可以使用一个更好的 API 来实现它。

    此外,在性能方面,FileSystem API 很好,因为它可以对文件进行流式写入和读取,而不是必须在将文件写入 IndexedDB 键之前将其全部构建到内存中。对于大型文件来说,这非常重要,因为你不想占用大量内存。

    总之,我相信我可以想到更多 FileSystem API 有用的例子。IndexedDB 很酷,它可以存储文件,因为它可以使一些东西成为可能,但我认为最终 Firefox 和其他浏览器应该实现 FileSystem API。它关注的是不同的用例,而且是一个非常有效的用例。谢谢!

    2012 年 7 月 5 日 下午 1:56

    1. Devon Govett

      哎呀,后来才意识到,实际上是 Jonas 写了这篇文章,而不是 Robert。我在 Twitter 上看到了他的链接。抱歉!

      2012 年 7 月 5 日 下午 1:57

      1. Robert Nyman

        不用担心。:-)
        Jonas 写了这篇很棒的博文,我很高兴人们想要讨论这个话题!

        2012 年 7 月 5 日 下午 2:21

    2. Jonas Sicking

      为什么你说将元数据和文件存储在 IndexedDB 中很蹩脚?

      查看最终代码,我认为与提交给 W3C 的 FileSystem API 相比,你将需要更少的代码来与 IndexedDB 交互。

      2012 年 7 月 5 日 下午 4:26

      1. Devon Govett

        好吧,对于我上面提到的用例,你必须在 IndexedDB 之上自己实现文件系统抽象,而不是直接使用 FileSystem API。像目录列表这样的东西必须编写,当然,存储元数据(如文件修改时间)也必须手动编写。这完全是可行的,我甚至已经把它作为 shim 做过,但是 FileSystem API 是一个很好的抽象,浏览器可以将其直接内置。它还允许流式写入,但看起来你已经在 FileHandle 中为这个问题找到了解决方案。如我所述,文件系统 URL 也很不错,它们依赖于特定的文件路径,而文件系统抽象在包含了目录概念的情况下提供了这一点。

        2012 年 7 月 5 日 下午 4:42

        1. Jonas Sicking

          很好的反馈。我同意,与使用 IndexedDB 相比,FileSystem API 确实减少了一些抽象逻辑,如果你想要的是一个文件系统。我只是不确定与访问数据的其他方式相比,它的使用频率如何,比如文章中给出的两个例子(游戏数据或 Web 邮件客户端)。

          非常乐意听到更多类似的反馈!

          2012 年 7 月 5 日 下午 4:56

  4. Samuel Erdtman

    有趣的是,我之前尝试过使用文件写入 API 来保存通过 WebSockets 从一个用户发送给另一个用户的文件。当时它还没有在任何地方实现,所以最终我采用了另一种解决方案,它最终效果更好,对接收浏览器的要求也更低 (http://code.google.com/p/sendnow/)。这是一次有趣的学习体验,我最想要的事情之一就是能够在浏览器中保存文件,而不必像 Marat 提到的那样,需要进行服务器往返。所以这种情况可能是我会发现有用的。
    但是,我希望将来看到更少的与文件相关的操作。操作系统正在试图向最终用户提供更高层次的文件抽象。我们不再需要音乐文件,而是歌曲,它可能是多个文件,我们也不需要知道它们存储在哪里。因此,我不喜欢我们在浏览器中也创建文件抽象,仅仅是为了将其从最终用户那里抽象出来,而他们只想看到自己的图像、歌曲、地点、朋友、文本等。为什么我们如此渴望再次创建文件,为什么不直接使用资源呢?
    此外,如果用户离线,浏览器应该从缓存中向我提供资源,当用户重新上线时,它可以从原始位置获取资源(当然,该资源必须被标记为可供离线使用),那么作为一名 Web 开发人员,为什么我需要关心资源来自哪里?考虑到这一点,IndexedDB 看起来是一个很好的开始。关于使用 IndexedDB 解决方案时必须将大型文件加载到内存中的担忧,我认为资源不应该那么大,最好将大型资源处理为更小的资源,这反过来可以解决想要访问大型文件中间部分的问题。

    2012 年 7 月 5 日 下午 3:12

  5. Daniel

    我们不要轻视或回避所有文件 API 在任何系统中的一个重要用例:对文件的 CRUD 操作。假设“Web 是平台”,那么强大的 Web 应用程序将不会想要写入或修改 Windows/OSX/等用户文件夹中的真实文件,认为这一点是不符合实际情况的。

    考虑以下情况:

    想要制作一个照片编辑应用程序,将修改后的 JPEG 副本保存到原始文件旁边? -> 做不到。

    想要开发一个代码编辑器,编写或修改位于用户机器上的标准位置的代码文件? -> 不可能。

    想要创建一个幻灯片/演示工具,将内容保存为原生应用程序可以使用的已知格式? -> 不要尝试。

    这是现实 - 拒绝承认这一点并不会让它消失。

    2012 年 7 月 5 日 下午 4:03

    1. Jonas Sicking

      我完全同意。这就是我们开发 DeviceStorage API 的原因。一旦完全实现,它将支持在用户目录中执行 CRUD 操作。安全模型是这里的难点。

      如文章中所述,提交给 W3C 的 FileSystem API 规范不支持在用户目录中进行任何类型的文件处理,只支持在浏览器沙盒中进行处理。

      2012 年 7 月 5 日 下午 4:19

      1. Angelo Borsotti

        应用程序通常访问本地文件系统。如果我们想
        使用 Web 技术(而不是,例如
        C++ 或 Java)来实现应用程序,我们需要有一种方法来访问本地
        文件系统,以及底层操作系统的其他部分。
        安全对于传统应用程序来说从来不是什么大问题。
        例如,安装 Libreoffice 时(知道它不包含
        病毒),我不认为它会破坏我的数据或篡改我的
        操作系统。也就是说,在安装它时,我相信它。
        如果 Web 应用程序仅仅是一种实现应用程序的技术,它应该
        做同样的事情:询问我是否信任它,如果是,则以完全权限运行,
        就像普通的应用程序一样。

        2012 年 9 月 15 日 上午 1:17

  6. Daniel

    Jonas - 我并不是说 Chrome 当前的文件 API 实现是我们应该复制的,或者它是否支持真正的文件 CRUD 操作。我只是说,真正的文件 CRUD 操作是我们需要支持的平台功能,以便认真地说出“Web 是平台”这句话。你不同意吗?

    2012 年 7 月 5 日 下午 4:25

    1. Jonas Sicking

      完全没有。如文章中所述,这就是我们实现 FileHandle 的原因,特别是为了支持 CRUD 操作。它将在 Firefox 15 中发布。

      出于安全原因,在用户目录中执行 CRUD 操作更加棘手。但这绝对是我们需要的,这就是我们设计 DeviceStorage API 的原因。

      2012 年 7 月 5 日 下午 4:31

      1. Daniel

        好吧,我被说服了!

        *** dbuc 准备从待办事项列表中划掉一项

        2012 年 7 月 5 日 下午 4:36

  7. 风格问题

    只是为了简化上面所有文字墙...
    没有沙箱 = 没有 FileAPI

    2012 年 7 月 5 日 下午 11:47

  8. Tane Piper

    我在这个 Google 实现的基础上写了一个 API 封装器 (http://github.com/tanepiper/webfs),我发现使用起来非常痛苦,但同时也非常方便。

    我个人希望看到它被实现,它将提供跨浏览器的兼容性,而无需在 IndexDB 周围添加更多封装,但我也希望看到规范草案得到改进,通过供应商共同努力来实现。

    2012 年 7 月 6 日 上午 1:22

    1. Jonas Sicking

      这是我听到每个人都给出的反馈。FileSystem API 使用起来很麻烦。我认为 IndexedDB 看起来像一个更简单的解决方案,这也是原因之一。无论我们在 Mozilla 做了什么,IndexedDB 都很可能成为跨浏览器的解决方案。

      2012 年 7 月 9 日 下午 8:50

  9. Jussi Kalliokoski

    对于需要大量资源(如图像和声音)的应用场景,这些资源需要下载并本地使用,甚至可能离线使用,我认为文件系统 API 不应该是选择,尤其是 IndexedDB。相反,我希望现在被称为应用缓存的混乱状况得到解决,对于像这样的用例,它将被使用。

    很棒的文章,Jonas!文件系统 API 很难破解,网络平台的安全要求也让它变得更加困难。

    2012 年 7 月 6 日 上午 4:18

    1. Jonas Sicking

      是的,对于应用缓存可以解决问题的情况,我同意它通常是一个更好的解决方案。至少在我们改进它,让用户真正喜欢使用它之后 :-)

      2012 年 7 月 9 日 下午 8:51

  10. Oleg

    “访问图片和音乐文件夹”,“低级文件操作”,“文件系统 URL 方案”

    所以,您没有提供一个解决方案(FileWriter 和 Filesystem),而是提出了两个新的、不同的解决方案,不仅您还没有完全支持,而且其他供应商也不支持,而对于第三个功能,您根本没有解决方案。

    没有 API 是完美的,如果您能认识到 Filesystem 和 Filewriter 中存在的问题,并不意味着它们不可用,我更希望您先尝试实现 Filesystem,然后再尝试您的想法,让我们开发人员选择想要使用的那个。

    IndexedDB 在其他两个浏览器中实现,但许多人认为它很难使用,我倾向于同意这种观点。
    出于某种原因(哦,是的,安全问题等等),只有 Firefox 会要求用户许可才能使用它。对我来说(以及许多其他开发人员和应用)这是一个很大的危险信号,令人却步。

    我不是说你应该模仿 Chrome 的设计,我是说我不想编写我为 IE 编写的那些 API 封装器,也不想学习
    两个(三个、四个,有多少供应商想创建一些酷炫的东西?)不同的 API 来完成几乎相同的事情。

    FileSystem API 的一个优点是它可以工作,而且运行良好,适合它被设计的使用场景。

    2012 年 7 月 6 日 上午 8:43

    1. Jonas Sicking

      我不确定我理解您所说的“所以,您没有提供一个解决方案(FileWriter 和 Filesystem),而是提出了两个新的、不同的解决方案”是什么意思。

      当然,IndexedDB + FileHandle 比 IndexedDB + FileSystem + FileWriter 解决方案更少。

      我同意 IndexedDB 很难使用。但并不比 FileSystem 更难。如果只需要存储资源而不是进行低级文件操作,那么 IndexedDB 看起来更简单。但我承认自己有偏见 :-)

      顺便说一下,从 Firefox 16 开始,我们将不再提示使用 IndexedDB。

      2012 年 7 月 9 日 下午 10:04

      1. Eric Uhrhane

        我认为更公平的比较是
        IDB + FileWriter + FileSystem + 一些非常小的 API,可以让您访问“我的照片”
        VS.
        IDB + FileHandle + DeviceStorage API

        这样一来,就很明显地看出它们在范围上实际上非常相似。我假设您正在尝试以某种方式处理用户媒体文件;如果您只是存储事务数据,或者想要在沙箱中编辑大型文件,答案会发生变化。

        我在两者中都包含 IDB,因为三个主要浏览器已经在实现它,所以如果您想要用于事务数据,它就在那里。

        2012 年 7 月 10 日 下午 4:55

    2. Jonas Sicking

      哎呀,我忘了最重要的问题。

      您提到您更喜欢使用 FileSystem API 而不是 IndexedDB。您能详细说明一下为什么吗?

      2012 年 7 月 9 日 下午 10:05

  11. Eric Bidelman

    在与使用 Filesystem API 的开发人员合作时,“将元数据与 File/Blob 数据一起存储”并不是一个常见的需求。大多数人只是想要一个更通用的应用缓存。人们真正想要的还有 FileSaver API 的一个版本。+1!

    正如您所指出的,W3C Filesystem API 的一个主要优点是它的 filesystem:URL。无需编写任何代码即可使用本地缓存的资源非常有吸引力。将此与文件夹层次结构结合起来,您就拥有了一个完整的离线解决方案,可以复制服务器的文件结构。相当不错。

    从我个人使用 Filesystem API polyfill (https://github.com/ebidel/idb.filesystem.js) 的经验来看,使用 IDB 在逻辑文件夹中组织数据并非易事。此外,稍后删除整个“文件夹”需要设置棘手的键范围并确保排序正确。整个过程感觉很糟糕。

    2012 年 7 月 6 日 上午 9:23

  12. Eric Uhrhane

    关于 filesystem API 仅授予对沙箱的访问权限,而不是例如“我的照片”。

    有点像——API 的 99% 不关心底层是什么(无论是与沙箱还是真实文件系统通信)。出于明显的安全原因,网页目前获取 FileSystem 对象的唯一方法是请求对沙箱的访问权限。我们已经实现了扩展 API,可以授予对完整文件系统的访问权限——这就是 ChromeOS 用来实现文件浏览器的机制——但我们还没有将它们暴露给网络平台。然而,API 的其余部分完全相同,因为它是在我们最终弄清楚如何安全地将真实目录暴露给网络的意图下设计的。

    我们认为,使用相同的 API 来解决多个问题是有意义的,而不是为这个用例发明一个狭窄的 DeviceStorage API。文件系统是一个非常通用、熟悉的 API;它并不一定适合所有用例,但对于相当多的用例来说,它还是相当不错的。正如您所指出的,我们只需要先解决安全问题。

    关于 FileHandle,它可以更有效地进行读-改-写并进行锁定。很遗憾,关于这个问题的讨论在 public-webapps 中不了了之;我认为这是一个非常有趣的建议,我们当然愿意讨论如何将其合并到我们的 FileSystem 实现中。我不知道有任何应用程序对当前 API 的速度有问题,所以我不知道潜在的效率提升能给我们带来多少益处,但我真的很喜欢锁定模型。

    2012 年 7 月 6 日 下午 5:10

    1. Jonas Sicking

      你好,Eric!

      是的,我们应该继续讨论 FileHandle!

      我同意你的观点,如果我们应该有一个 API 将沙箱文件系统暴露给网页,那么我们应该使用相同的 API 将用户文件暴露出来,就像将沙箱文件系统暴露出来一样。

      2012 年 7 月 9 日 下午 10:18

      1. Brian Stell

        持久 URL(例如,文件系统 URL)是否提供更低的延迟才能访问数据?例如,使用持久 URL 是否可以加载 CSS、JavaScript 或其他资源以进行解析?我理解的是,一旦拥有了 Blob URL,它就和持久 URL 一样快,但是……Blob URL 是否在回调中返回?解析期间最早的回调何时才能可靠地返回?

        2013 年 3 月 21 日 下午 4:17

        1. Jonas Sicking

          一旦有了 Blob,获取 Blob URL 速度非常快。只需执行以下操作

          url = URL.createObjectURL(blob);

          无需异步回调或其他操作。

          但是,如果 Blob 存储在数据库中,那么获取 Blob 将是一个异步操作。

          所以,是的,文件系统 URL 方案确实有优势。正如上面文章中的“文件系统 URL 方案”部分所讨论的那样。

          2013 年 3 月 22 日 上午 11:38

          1. Brian Stell

            啊,对了,需要回调才能获取 Blob,而不是 URL。谢谢 :-)

            同意文件系统 URL 有优势。是否有计划在 IDB 中实现它(或类似的东西)?

            2013 年 3 月 22 日 下午 1:26

          2. Jonas Sicking

            是的,我很想解决这个问题。但它并不简单。文件系统之间在 URL 和存储位置之间存在明显的映射,因为文件系统基本上是一个以路径为键的数据库,而 URL 具有明确的路径。

            而且存储在文件系统中的值始终是 File,这使得它很容易映射到网络响应。

            但是 IDB 通过更复杂的键概念进行键控,这使得将 URL 映射到 IDB 位置变得更加困难。存储在 IDB 中的值是任意的结构化克隆,这使得它们更难映射到网络响应。

            不是说不可能,而是说怎么做不太明显。

            我很想就这个问题进行讨论,但我不认为这里合适。W3C webapps 邮件列表可能是最明显的选择。或者随时直接联系我。

            2013 年 3 月 22 日 下午 2:10

  13. pd

    凭直觉,您可能忽略了一个人们想要使用文件系统 API 的简单原因:因为他们认为 Chrome 是最合适的浏览器目标,也许 API 最易于使用,所以他们将目标锁定在 Chrome 上,并且希望实现跨浏览器兼容性,而不是重写他们的工作。

    或者更简洁地说:Firefox 现在不再是创新的领导者了。Mozilla 可能会发现自己第一次必须屈服于更具主导创新力的浏览器的标准化推动。

    2012 年 7 月 7 日 上午 12:44

    1. Jonas Sicking

      大多数 Web 开发人员对跨多个浏览器都能工作的解决方案感兴趣。据我所知,FileSystem API 离这个目标还很远,只有 Google 表明了对它的实现兴趣。与此同时,IndexedDB 在三个浏览器中实现,第四个浏览器也正在实现。

      但我同意,如果您想要的就是一个文件系统,那么 FileSystem API 比数据库 API 更适合。

      您能详细说明一下为什么您需要文件系统 API 吗?

      2012 年 7 月 9 日 下午 10:29

      1. Eric Uhrhane

        我同意 Jonas 的观点。如果你只能选择一个浏览器作为目标,那么你写的就不是网页,而是应用程序。这并不一定不好,但我们真的希望有一个强大的 Web 平台作为目标,可以运行在任何浏览器上,用于不需要应用程序权限的功能。

        当然,如果其他浏览器也采用 FileSystem,我们会更高兴,但我们愿意将其发布出来进行实验,以证明其实用性,并努力说服他们。同样,其他浏览器也正在提出自己的实验[例如 FileHandle];没有哪个浏览器团队“在创新方面独占鳌头”。

        2012 年 7 月 10 日 下午 5:01

  14. John Thomas

    我认为文件系统 API 的吸引力之一(不评论 Google 的规范)是,如果你正在使用文件或与文件系统交互,它非常直观。从文档编辑器到想要保存状态的游戏,有许多 Web 应用程序这样做或试图这样做。如果你鼓励开发人员在脱机模式下工作,那么他们会考虑使用文件系统 API。

    如果我可以在这个问题上提出一项 IndexedDB 的本质限制,那就是它不能跨浏览器共享(对于那些说使用一个浏览器工作,另一个浏览器娱乐,或者希望一台电脑上的一个浏览器轻巧灵活,而另一个浏览器则可以占用更多内存的用户来说,也不应该共享)。如果我正在加载和保存一个文件,我不会想总是使用那个浏览器,或者甚至不一定在那个应用程序中使用它。如果你考虑有多少应用程序令人沮丧,因为你想在应用程序之间导出/导入,但它们不允许你这样做,我认为你可以看到拥有一个独立于浏览器的存储介质的优势。

    当然,如果你想使用真正直观的东西,浏览器可以实现 POSIX 文件 API 的某种变体(当然要适应 JS 约束)。是的,它不是 Web 风格的,但许多编程语言已经认识到,即使 POSIX 文件 API 不一定适合它们的 dominant paradigm,支持它仍然很有用,因为大多数开发人员不只使用一种编程语言,并且大多数人都会熟悉这种 API。

    这是 DOM 背后相同的本质论据。鉴于规范机构似乎拒绝了这种方法,转而支持面向 JS 的 API,我怀疑我的建议会被采纳。

    2012 年 7 月 10 日 上午 5:58

  15. Eric Uhrhane

    还有一件事,关于 fsync/flush。我完全同意我们需要将其添加到 FileWriter [以及可能还有 FileSystem - 我需要检查实现细节]。这是一个小而简单的改变,只需要一些思考才能使语义完全正确。

    2012 年 7 月 10 日 下午 6:41

  16. Joran Greef

    问题的核心在于,Mozilla 如今在浏览器创新方面的做法是自上而下的。浏览器供应商聚在一起,决定他们想要提供的哪些高级功能(UndoManager、IndexedDB 等),然后通过委员会制定规范。开发人员可以在 Public Web Apps 列表中发表意见。最终,我们在浏览器中得到了数百个质量低劣的 API,并且针对这些 API 提出的错误需要数年才能修复。

    例如,IndexedDB 可能还需要几年才能支持二进制键,或从二进制值中读取范围,或者超出“读者阻塞读者”或“读者阻塞写入器”概念的并发语义。

    更具创新性的是,浏览器供应商应该开放并转向自下而上的创新。只提供 3 个强大的低级 API,并相信开发者社区可以完成其余工作。

    例如,如果浏览器允许用户为 Web 应用程序赋予原始 POSIX 权限,那么这将释放出在浏览器中运行的数据库的爆发式增长,其速度和效率将比 IndexedDB 高出几个数量级。

    问题的关键在于,浏览器需要“允许”我作为用户为我信任的 Web 应用程序赋予权限。如果我购买了一台具有 UDP、TCP 和 POSIX 功能的强大机器,那么我希望能够将这些功能委派给我信任的 Web 应用程序。如果一个 Web 应用程序滥用我的信任,那么我希望能够撤销这种信任。

    如果浏览器不信任我作为用户,也不允许我以这种方式为 Web 应用程序赋予权限,那么浏览器最终就不会按照我的意愿工作,它不会为我服务,Web 应用程序将无法竞争。

    Tim Berners-Lee 最初在 Public Web Apps 上提出了这一点(http://lists.w3.org/Archives/Public/public-webapps/2012JanMar/0464.html)。

    2012 年 7 月 19 日 上午 0:48

    1. Jonas Sicking

      关于高级与低级,不同的开发人员有强烈的不同感受。

      一方面,你说 IndexedDB 太高级了,如果你能获得像 POSIX 这样的低级 API,你就能做得更好。

      另一方面,我一遍又一遍地听到关于 IndexedDB 的主要抱怨是它太低级了,一个像异步 localStorage 这样的更简单的 API 会更好。

      事实上,它足够低级,你可以用它来实现 FileSystem API,也可以用它来实现异步 localStorage API,但它又足够高级,你可以直接在许多情况下使用它,这告诉我我们可能没有偏离太远。

      关于 POSIX:使用 FileHandle,你拥有一个非常低级的 API 来进行文件处理。它应该包含所有必要的原语来在其之上实现数据库。所以我正在等待你基于它构建的更好、更快的数据库 API :-)

      关于 TCP/UDP:我很乐意支持它!主要问题是安全性。公开一个原始 TCP API 将允许读取公司防火墙后面的数据,以及允许使用网站访问者作为客户端进行 DDoS 攻击或分布式暴力破解密码攻击。

      2012 年 7 月 19 日 上午 1:54

      1. Joran Greef

        你回避了最初的观点,即浏览器中的创新目前是自上而下的,无论是 FileHandle、WebSocket、IndexedDB 还是 WebRTC,你随便说吧。这些都是对操作系统 API 的有限抽象。如果 Mozilla 真正开放,它会公开这些 API。

        遗憾的是,Web 应用程序被严格地锁定在各个规范委员会中。创新根本不应该通过这种流程。

        Alan Kay 说得最好

        http://www.drdobbs.com/architecture-and-design/interview-with-alan-kay/240003442?pgno=2

        Alan Kay:“…你绝对不希望在 Web 浏览器中看到任何功能。”

        采访者:“任何功能?”

        Alan Kay:“是的。你想从对象中获取它们。你想让它成为一个迷你操作系统,而那些创建浏览器的人把它误认为是一个应用程序。他们挂科了操作系统 101。”

        采访者:“为什么这么说?”

        Alan Kay:“我的意思是,看看它:操作系统的任务是安全地运行任意代码。它不是在那里告诉你你可以运行哪些代码。大多数操作系统都有太多功能。UNIX 在最初设计时的好处不仅仅是只有 20 个系统命令,而且内核只有大约 1000 行代码。Linux 也是如此。”

        Web 平台需要尽可能地去中心化,而不是中心化。提供最少的必要的操作系统 API(TCP、UDP、POSIX),以及一种让用户说他们信任 Web 应用程序的方法,然后尽快退出,让社区编写数据库、P2P 代码、"FileHandle"、"IndexedDB" 以及所有其他内容。不要尝试将其捆绑为浏览器的一部分。让下一代库作者来处理它。

        关于你所说的 Web 应该被拒绝 UDP 因为“主要问题是安全性”,UDP 本身对于可信应用程序来说并不存在安全问题,并且世界迄今为止一直很好地运行在这种模式下。

        一定是 1984 年,人们可以使用浏览器,但不能被允许将原始 TCP 或 UDP 或 POSIX 授权给人们信任的 Web 应用程序。

        2012 年 7 月 19 日 上午 3:19

  17. Benz

    对于我们的用例,文件系统 API 工作得很好,我不明白你的建议的替代方案如何适用。我们有一个网站提供视频学习资料。人们可以选择下载视频并离线观看。这些视频可能高达 500 MB。用 IndexedDB 这样做是不可能的,因为将 500 MB 的文件保存在内存中以从 Blob URL 读取它不是一个可行的选择,对吧?
    我们应用程序的第二部分是一个视频编辑器,你可以在线和离线使用。文件系统 API 允许我们让用户从他的硬盘上选择视频文件,然后在沙盒中,他可以在上传最终作品之前进行各种操作。同样,这些文件可能有多个 GB。我认为 Blob URL 在这里行不通。此外,我认为对于处理文件的这类应用程序,除了文件系统 API 之外的任何东西都是不必要的抽象。理想情况下,文件应该被视为文件,仅此而已,对吧?我很乐意向你展示这个应用程序(目前处于测试阶段,还没有公开访问),因为我认为它很好地展示了为什么文件系统 API 非常强大,并且还可以从你那里获得一些灵感,看看如何在没有它的情况下完成它。因此,如果你愿意,我可以通过 Hangout 屏幕共享会议向你演示这个应用程序……

    2012 年 10 月 20 日 下午 1:07

    1. Jonas Sicking

      IndexedDB 与文件系统 API 一样,将文件存储在磁盘上。没有东西被保存在内存中。它们存储在数据库之外,因此大小不会影响数据库的性能。

      Blob URL 只是一个 30 字节的字符串,所以你可以通过它加载 GB 级别的數據。并且视频代码足够智能,能够像直接从文件中读取一样跳到文件的任何部分。

      存储在 IndexedDB 中的文件的文件部分与存储在文件系统中的文件完全一样。唯一不同的是导航目录结构。因此,大多数事情应该感觉完全相同。

      2012 年 10 月 21 日 上午 10:13

      1. Benz

        嗨 Jonas,

        感谢你澄清这一点。我一直以为你需要将整个文件加载到内存中才能通过 Blob URL 访问它。所以现在我知道了,我会试一试。如果它有效,可能会彻底改变我对这个话题的看法 :-) 那么看来对我来说唯一缺少的功能就是你文章中提到的文件系统 URL 方案。如果能以某种方式预测某个 Blob 的 URL 会非常不错。

        2012 年 10 月 21 日 上午 11:04

  18. Daniel O’Callaghan

    关于文件夹上传,你有什么想法吗?
    文件系统 API 支持递归遍历文件夹/子文件夹,你可以获得对每个对象的引用,并选择性地将其复制到持久存储中,以支持可恢复上传等。
    是否可以在没有文件系统 API 的情况下实现这一点?
    谢谢

    2013 年 1 月 3 日 下午 9:13

  19. Michaela Merz

    你知道吗?我个人对如何做到完美的细节并不关心。我认为能够通过 xhr 上传数据,但不能在现实世界中下载和存储数据是荒谬的。每个人都在谈论摆脱 flash、java。但如果事情变得一团糟,我们仍然需要它来导出数据。

    有很多原因让我们需要 xhr 下载来获取数据到 javascript 环境,修改它,最后让用户保存到他选择的的位置。

    Chrome 的人似乎明白了这一点。

    2013 年 1 月 13 日 下午 6:26

    1. Jonas Sicking

      如果你真的读了这篇文章会很有帮助。你似乎遗漏了一些要点。

      * Chrome 中可用的文件系统 API 只允许在沙盒文件系统中存储文件,用户无法访问。
      * 文件系统 API 不允许将文件保存到用户选择的某个位置。
      * 有些方法可以解决在客户端存储 xhr 下载文件的问题。这些方法在 Firefox 和 IE10 中都有效。Opera 也正在努力实现这一功能,Chrome 团队也表示他们计划添加支持。

      2013 年 1 月 14 日 下午 6:23

      1. Michaela Merz

        Jonas:这并不完全正确。任何沙盒中的文件都可以轻松地通过 filesystem:// URL 转换为下载文件。

        Michaela

        2013 年 1 月 17 日 下午 3:45

        1. Jonas Sicking

          当然。对于存储在 IndexedDB 中的文件来说也是如此。不同的是你使用了一个 blob: URL。

          2013 年 1 月 17 日 下午 4:49

      2. Michaela Merz

        我只知道有文件名的 blob URL。

        2013 年 1 月 18 日 上午 1:37

  20. Michaela Merz

    Jonas:不要误会我的意思。我很感谢你的工作。但请记住,浏览器正在成为通用的工具。我们必须能够像这样使用它。正如我之前所说:这不是一个竞争哪个方式更好的问题。我不在乎是文件系统还是 IIndexeddb + filewriter + saveAs 函数。但是,目前还没有 'saveas' 函数,只有神秘的 blob URL,它不会给我机会将数据保存到特定名称下。

    2013 年 1 月 18 日 上午 1:51

    1. Jonas Sicking

      啊,你对 blob URL 缺少的是指定建议文件名的功能?

      如果是这样,请查看支持新 <a> 属性的最新 nightly 版本。此属性通常是触发下载属性的更好方法,因为它允许你触发所有类型文件的保存对话框。

      一个普通的 <a href="..." rel="nofollow"> 只有在 URL 返回它无法识别的文件类型时才会触发保存对话框。因此,你不能用于图像,除非你发送一个 content-disposition 头,但这不适用于文件系统 URL 或 blob URL。

      2013 年 1 月 18 日 上午 2:13

      1. Jonas Sicking

        啊,应该说

        啊,你对 blob URL 缺少的是指定建议文件名的功能?

        如果是这样,请查看支持新 <a download> 属性的最新 nightly 版本。此属性通常是触发下载属性的更好方法,因为它允许你触发所有类型文件的保存对话框。

        一个普通的 <a href=”…”> 只有在 URL 返回它无法识别的文件类型时才会触发保存对话框。因此,你不能用于图像,除非你发送一个 content-disposition 头,但这不适用于文件系统 URL 或 blob URL。

        2013 年 1 月 18 日 上午 2:16

  21. Michaela Merz

    Jonas:当然可以使用 Chrome 的文件系统调用触发强制下载。事实上,我认为能够将数据下载到文件中至关重要——而不是在浏览器中显示它的内容。

    所以——我认为“a download”属性可能是解决当前问题的一种好方法。即使这意味着我们必须重新编写完整的下载部分。

    希望尽快在 Mozilla 的“官方”版本中看到它。你知道这需要多长时间吗?

    Michaela

    2013 年 1 月 18 日 上午 2:50

    1. Jonas Sicking

      我不知道你所说的“当然可以使用 Chrome 的文件系统调用触发强制下载”是什么意思?有关文档的链接会很有趣。

      <a download> 属性将在 Firefox 20 中使用,该版本预计将在 4 月 2 日左右发布。我相信它已经在 Chrome 中实现了。

      2013 年 1 月 18 日 上午 3:00

  22. Benz

    在更加熟悉 IndexedDB 之后,我开始真正喜欢它,并且不会错过 Chrome 文件系统 API 中的很多功能。真正缺少的只是一个可预测的指向文件的链接(blob),就像文件系统 URL 方案一样。首先,如果 blob: URL 可以在创建后一直保持有效,这样就不必在每次浏览器会话中使用 createObjectURL 那就很好了。
    Benjamin

    2013 年 1 月 18 日 上午 4:03

  23. Michaela Merz

    好吧——经过一天的疯狂操作,我可以确认上传、下载和存储(某种程度上,blob URL)任意大小的文件工作正常——尽管出于某种原因,浏览器有时在文件大小超过 50MB 时会完全崩溃。还没有找到原因。

    Chrome 似乎没有文件句柄 API,所以我使用文件系统。我没有 Internet Explorer(谁有?;)所以没有测试。

    现在——如果我们能得到 download 属性;)

    感谢你 Jonas 的工作。

    2013 年 1 月 18 日 下午 2:25

    1. Jonas Sicking

      请注意,如果你只是下载文件并保存它们,则不需要使用 FileHandle API。只需将 Blob 放入数据库,就像任何其他类型的 value 一样,例如字符串或布尔值。

      只有在想要修改文件内容,并且它已经保存到磁盘后才需要使用 FileHandle。

      2013 年 1 月 18 日 下午 2:57

  24. Michaela Merz

    感谢 Jonas。我知道这一点。但是,我正在修改数据(过滤),所以需要文件句柄 API。

    另一个问题:如果有多个(> 40)xhr 请求,每个请求都发布 3MB 的数据,那么是否有什么东西会超出范围?我遇到了各种奇怪的行为,从变量内容消失到完全崩溃。

    让我想起了我以前使用 'C' 的日子 .. ;)

    Michaela

    2013 年 1 月 18 日 下午 3:06

  25. Benz

    @Michaela:我对 IE10 做了一些测试,令我惊讶的是,它处理这些事情非常出色。我用它来存储 300MB 的视频文件,它运行得很好。Firefox 似乎也运行良好,但不幸的是无法播放我的 h264 文件。我们在 Firefox 中使用了一个 flash 备用程序,但 flash 无法访问 blob: URL :-) 有趣的时代……

    2013 年 1 月 18 日 下午 3:29

  26. Michaela Merz

    @Benz 我刚刚使用 Mozilla 上传和下载了 121886616 字节,并在期间进行了一些底层文件修改。我很高兴,几乎达到了本机上传和下载速度,即使是底层修改也是如此。

    哦,还有,崩溃是由于 firebug 在上传时打开造成的。

    m.

    2013 年 1 月 18 日 下午 3:43

  27. Geoff Flarity

    与此同时,在地球上,iOS 和 Android 的 API 架构师正在窃笑……开放网络标准开发已成为一个笑话。太多无谓的争论,没有多少进展。

    2013 年 1 月 19 日 上午 6:54

  28. maxw3st

    我肯定会坚持你已经使用的 indexdb 解决方案,并在可能的情况下对其进行添加。整个 URL/文件系统讨论的味道,最好由一个用于 URL 的数据库来处理,这些 URL 被索引到它们关联的文件。

    可以索引多个与同一个文件关联的 URL,以便存储一个该文件的实例,而不是为每个 URL 存储一个实例。

    2013 年 2 月 1 日 下午 9:46

  29. Michaela Merz

    奇怪的是,在我玩了 indexddb 一整天之后,它突然放弃了我。在打开时被阻塞,无法让它恢复。没有错误,只是没有结果或回调。我重新启动了浏览器,一切正常。

    2013 年 2 月 4 日 下午 1:02

  30. John McLane

    所以你是说 Mozilla 比 W3C 更了解 FileAPI 标准,以及其他正在实现它的浏览器供应商?

    2013 年 2 月 9 日 上午 9:48

  31. Anthony Caudill

    我闻到了血腥味。皇帝没有穿衣服。

    我上周末才发现我的游戏创作系统 webapp 依赖于 nsiFile 特权来加载文件,现在不能用了,因为 Firefox 17 禁用了 enablePrivilege。Mozilla 从什么时候开始变成老大哥了?我一直以为这是 M$ 的特权。当我听说 Bing 可以用作……真的,这已经超出了底线。这些人有没有一点心理意识?我想我当时应该意识到 Mozilla 正在从内部走下坡路。这让我有点生气……这些年来我一直支持你们,并押注你们会打败 MS,让浏览器成为计算的最终目标,现在你们却背叛了可移植性和兼容性。如果 Firefox OS 也是这样,那就算了。

    我预计 Mozilla 将会发生大变革,因为我看到程序员们正在酝酿一场反抗。对于那些从灰烬中崛起的人,以下是一些建议:专注于用户想要什么。我们想要 WHATWG 预想的 HTML 5,不多不少。我们希望结束浏览器特有的前缀。我们希望游戏手柄支持被提上日程……说真的,我已经等了一年了。我费心尝试编写一个演示程序,但我得到的只有我的罗技双行动力手柄读取失败,而我经常用它在浏览器之外玩游戏。如果你连沃尔玛的库存控制器都读不了,那还能读什么?莫奇拉的优先事项在哪里?

    不在我这里,我猜。我会远远地观望这场烟火……有时,进步的组织会被理想主义的、脱离现实的傻瓜接管,并不得不自我惩罚地在荒野中流浪一段时间。我想这对 Mozilla 来说就是其中之一。

    哦,我还要回到 Firefox 16。假设的安全漏洞就让他们见鬼去吧。

    2013 年 2 月 14 日 上午 8:52

  32. Jonas Sicking

    看来你没有参加上一次的 TPAC,在会上所有浏览器供应商,除了谷歌,都表示他们不打算实施目前的 FileSystem API 提案。

    你可能也还没注意到,FileAPI 完全独立于文件系统,它由 Firefox 实现,而且由我编辑:-)

    2013 年 2 月 14 日 下午 8:40

    1. Jonas Sicking

      澄清一下,Arun 负责 FileAPI 规范的全部编辑工作。但我仍然深度参与该规范,所以别担心,我们一直在关注它。

      2013 年 2 月 14 日 下午 8:45

    2. Anthony Caudill

      但 FireWriter API 不是,而我的抱怨就在这里。你毁掉了我的应用。据我了解,enablePrivilege 支持将在 FF 19 中回归(根据 Bugzilla)。

      开发者需求很重要。你无权移除重要的用户界面功能。如果你想坚持己见,那就这样吧。人们会做出自己的反应。我很乐意在 CNET 上阅读你被赶走,并被一个准备好立即投入工作的人取代的消息。

      我非常不安,因为我需要和你交涉。我以为 FF 是“站在我这边”的浏览器。相反,它试图保护我免受自己的伤害。你没有权利。

      这个规范已经处于停滞状态多年了。无论你的地位如何,其他人早在你之前就已经有了这个想法。别坐在屁股上,做点事情。

      2013 年 2 月 14 日 下午 11:40

  33. Michaela Merz

    @Anthony Caudill 我从一开始就一直支持 Mozilla,当时他们承诺会寄给我一张印有所有支持者的大海报。我甚至以我狗狗和鹦鹉的名义捐了钱,以便让全家人都在那张海报上(但我从未收到过)。但为了维护那些努力让这款浏览器运行起来的人:让所有人都满意可能是一项艰巨的任务。我一点也不关心游戏手柄或对苹果显示器的支持,但我迫切需要“download”属性来链接到索引数据库,以便能够以正确的名称存储块。

    但他们只有一双胳膊(我想)——所以——不幸的是,我想我必须等待(并且暂时向我们的客户推荐 Chrome)。我讨厌这样……但你能怎么办呢?

    @Jonas:这个功能有望得到提升吗?我很想在汉诺威消费电子展上展示我们的新系统和 Firefox;)

    Michaela

    2013 年 2 月 15 日 上午 5:39

    1. Jonas Sicking

      download 属性在 bug 676619 中实现,并将随 4 月初发布的 Firefox 20 一起发布。

      2013 年 2 月 15 日 上午 6:13

  34. Michaela Merz

    @Jonas 这真是个好消息。不过对汉诺威消费电子展来说已经太晚了 :) 谢谢。

    2013 年 2 月 15 日 上午 6:28

    1. Jonas Sicking

      它已经在 nightly 版和 Aurora 频道中提供,所以你已经可以进行演示了。只是不要将其推送到最终用户。

      2013 年 2 月 15 日 上午 7:12

  35. Rob Higgins

    抱歉,在你已经说了一切之后还要添油加醋,但求求你,给我一个跨浏览器的文件系统 API。我使用 PHP 和 JSON/AJAX 与我的客户端进行通信最舒服。我将客户端文件系统视为一个云端点,应该与服务器同步。
    沙盒是我们最大的优势,也是我唯一支持的安全方案。如果任何网站曾经请求访问我的本地文件系统(包括 Chrome/Fox 扩展程序),我将立即离开该页面,并告诉我的家人/朋友远离它。说真的?运行在第三方服务器上的开源代码,它经过无数台计算机,将可以访问我的用户文件?不,绝对不行。把你的时间花在编写有利于服务器/客户端环境的代码上,而不是让它变得更复杂。

    2013 年 2 月 21 日 下午 6:18

    1. Anthony Caudill

      好吧,Rob,我不会。Firefox 已经有了多年来可以访问文件系统的应用程序。所以,从那些应用程序的成功率来看,你并不算少数。

      我真的希望作者能放下他们与谷歌对手之间的争执,因为其他方法似乎都没有效果。我们需要一个标准。也许不是一个完美的标准,但一个可行的标准。我非常想开始建议 Firefox 定制者们另起炉灶,因为这个标准化进程似乎越来越受金钱利益的控制。过去,学术界负责监督一切,但现在我看不出还有这种情况。现在是 Moz、谷歌和微软在进行所有的实际开发标准化工作吗?如果第四个“如果你不公平竞争,我就带球回家”的玩家是人们需要的,那就是人们需要的,没有人比定制构建者更准备做这件事情了。

      2013 年 3 月 4 日 上午 10:27

  36. Angelo Borsotti

    浏览器是我最常用来访问数据和通用计算服务的工具。它具有很高的普及率和可编程用户界面 (HTML+javascript)。当我需要实施一个新的应用程序时,我可以使用传统的技术,例如 C 和 Java 以及一些用户界面库,或者我可以用网页来实现。后者更吸引人,因为我可以将应用程序作为网页访问,就像浏览器窗口中的标签一样。它也更吸引人,因为它让我免于学习其他语言和库。唯一的障碍是,网页无法像传统应用程序那样访问本地计算机(例如本地文件系统)。
    然而,在 Firefox 中,可以使用 AsYouWish 附加组件来实现。
    这意味着从现在开始,我可以轻松地实施可移植应用程序,这些应用程序可以在任何安装了 Firefox 的计算机上运行。

    2013 年 3 月 4 日 上午 11:49

  37. Rob

    我意识到我在这里是少数人,但就我个人而言,我不会安装任何 Firefox 插件 (http://www.lifehacker.com.au/2011/01/how-writing-firefox-extensions-can-scare-you-away-from-them/)。我安装的每个 Chrome 扩展程序,我都会先查看其隐私政策,如果它要求任何不寻常的东西,我就会不安装它。网络开发很有可能成为编程的最终标准,但要实现这一点,像 ff 这样的领先浏览器必须对其隐私控制进行分类。总有一天,我将不再是少数人,人们会意识到网络是多么不安全,并要求对他们的数据流进行全面的控制。为什么要等到发生不好的事情才行动?或者更糟的是,为什么要在浏览器成为最终的 IDE 之前就扼杀它,而它甚至还没有真正获得机会?

    2013 年 3 月 4 日 下午 10:34

    1. Brett Zamir

      这就是我在 AsYouWish 中向用户告知正在请求的特定权限或权限的原因。

      2013 年 3 月 13 日 上午 2:51

  38. Michaela Merz

    Angelo Borsotti:你可以使用 Firefox 来做这件事——有点类似。我正在使用 Firefox 和 indexddb 在文件系统中进出地移动 GB 级别的的数据。无需附加组件或插件。换句话说:Firefox 可以很好地访问本地文件。

    我希望 Javascript 也支持目录——但那是另一个故事。

    随着即将发布的版本 20,Firefox 的文件系统 API 将会完善。但它工作良好(除了“另存为”功能)。

    不幸的是,我还必须添加 Chrome 文件系统以支持这两个系统。这听起来像是网页编程的早期阶段:)

    致以诚挚的问候
    Michaela

    2013 年 3 月 5 日 上午 8:21

    1. Angelo Borsotti

      Michaela:我理解这个 API 允许访问某种沙盒文件系统或专用数据库中的文件,而不是访问其他应用程序也可以看到的普通本地文件。情况不再是这样了吗?
      -Angelo

      2013 年 3 月 5 日 上午 11:37

      1. Jonas Sicking

        是的,IndexedDB 和 Google 文件系统 API 都只提供对沙盒的访问。

        我们正在使用 DeviceStorage API 来公开文件系统的其他部分。但安全和隐私问题非常棘手。请参阅文章中的“访问图片和音乐文件夹”部分。

        2013 年 3 月 5 日 上午 11:45

  39. Michaela Merz

    Angelo:好吧,如果你想知道你是否能够访问、传输、下载和存储任意数据——是的,你可以。你可以选择一个文件,通过 xhr 访问和传输它,通过 indexddb 下载和存储它,最后将 blob 导出到现实世界。目前唯一缺失的(但将在 Mozilla 20 中包含)是“另存为”功能——换句话说:目前最后一步会给你一些奇特的 blob 文件名,例如“g670xixN.part”。

    Michaela

    2013 年 3 月 5 日 下午 2:17

    1. Angelo Borsotti

      Michaela,我想知道页面中的脚本是否可以在没有向用户显示文件选择器并让用户选择文件名的情况下读取文件,以及是否可以在不征得用户许可的情况下写入文件(例如,显示“另存为”对话框)。
      这是传统应用程序可以做的事情,也是使用 AsYouWish 附加组件的网页可以做的事情。

      2013 年 3 月 5 日 下午 4:42

  40. Michaela Merz

    Angelo: 不,据我所知,这是不可能的(在 Chrome 中也不可能)。作为一个安全专家,我认为这非常危险,并且会一直建议不要使用这种技术。

    Michaela

    2013 年 3 月 5 日 下午 6:14

    1. Angelo Borsotti

      Michaela: 我的电脑是我的,里面的数据也由我管理。
      其他人不能主张保护它们的权利。Firefox 正在采取
      立场以“父亲般的关怀”代表用户(例如,参见 https://bugzilla.mozilla.org/show_bug.cgi?id=546848)。
      我认为这是不正确的。Firefox 应该只提供工具,并告知用户哪些可能危险,哪些不危险。然后由用户自己处理,无论它们有多危险。
      当我下载并运行原生应用程序时,我接受了篡改数据的风险,
      并只使用来自某些可信提供商的应用程序来处理它。
      当我使用 Web 应用程序时,我希望做同样的事情。

      Angelo

      2013 年 3 月 6 日 上午 0:54

  41. Michaela Merz

    Angelo: 这就是有扩展的原因。我感谢 Firefox 为保护普通用户数据所做的努力。

    Michaela

    2013 年 3 月 6 日 上午 1:30

    1. Angelo Borsotti

      Michaela: 我也感谢这些努力。但是,保护不能过度到阻碍用户。

      2013 年 3 月 6 日 上午 2:25

  42. Rob Higgins

    我完全同意 Michaela Merz 的观点。扩展是为那些希望将权限扩展到浏览器安全模型之外的人准备的。一个全新的 FF 安装不应该允许任何网站访问我的电脑,假设我信任它这样做,因为与它不应该允许跨域访问的原因相同。全新的现代浏览器应该支持文件系统,但每个域都应该隔离在自己的沙盒中。

    那些没有看到这个问题的人要么是无知的,要么是主张邪恶的行为。你试图对用户文件进行的所有操作都可以在更安全的方式(从服务器)完成。

    Chrome 和 FF 之间的主要区别在于,Chrome 会明确告诉你你正在授权哪些权限。我真的希望 FF 在未来能走这条路。

    2013 年 3 月 6 日 下午 1:21

    1. Angelo Borsotti

      Rob: 任何 ff 的安装(无论是全新的还是已有的)都不应该访问我的电脑。
      只有包含我明确声明为可信的应用程序的页面
      才能执行此操作。
      ff 本身是否提供访问电脑的功能
      还是由扩展提供是另一个问题。

      2013 年 3 月 6 日 下午 4:59

      1. Rob Higgins

        Angelo: 这就是问题所在,是原生还是插件。我投票支持保持浏览器的安全模型完好无损,并将高风险操作留给扩展。我不相信我的祖母知道她在点击随机的“接受”按钮时放弃了什么权利,大多数互联网用户也不知道。我的祖母知道如何安装 Firefox 插件吗?可能不会。

        我想我的立场基于我所熟悉的概念。如果你将浏览器视为操作系统,将插件视为应用程序,那么你就可以看到界线应该在哪里。开箱即用的操作系统不允许第三方代码获得特权访问。“安装”插件将授予权限,而删除或禁用插件将撤销权限。

        Chromebook 是一款很棒的产品,Firebook 也可以。未来的浏览器可以成为快速高效的操作系统,但为了实现这一目标,我们需要全面的安全控制,这些控制可以根据需要打开和关闭。当然,你可以使用白名单来实现这一点,但归根结底,我们应该鼓励更好的编程,不要让用户处于危险之中。

        2013 年 3 月 6 日 下午 7:04

        1. Angelo Borsotti

          Rob: 我也不反对使用扩展。这正是 AsYouWish 的作用:当你安装它时,你就可以打开执行特权操作的页面(在你授予……后)。
          另一个解决方案是将此集成到浏览器中,由用户明确启用。这将防止无意中授予权限。

          2013 年 3 月 7 日 上午 0:50

  43. Anthony Caudill

    反沙盒论据对我来说很愚蠢。我的意思是,限制本地页面的文件访问到它自己的文件夹和子文件夹有多难?我见过 Firefox 的源代码,并不难……有经验的源代码开发者可以在一个晚上实现它。我可能已经做到了,但这不是我的事,对吧?

    在注册表发明之前,16 位应用程序将它们访问的所有文件放在一个文件夹中是标准做法。实际上,Moz 本身也大多仍然这样做。对文件进行测试并说“好吧,这个文件的路径不包含调用文档的路径,因此它不可用于读取”是微不足道的。这对本地文件访问本地文件来说是有效的。

    对于网站访问本地文件,你可以提供一个选项,为该网站创建一个专门的文件夹。问题在于创建可识别名称……为此,你需要在 Firefox 中有一个命令,在用户请求时打开该网站的指定文件夹。用户不需要知道文件夹的真实名称……他们只需要能够查看其中的文件并导出/导入它们。

    我认为,这就是解决你问题的方案。开发者不应该被授予访问“我的文档”的权限……那只供用户查看。我刚刚给你的解决方案是我认为的唯一可行的答案。

    (……我快疯了。Chrome 越来越糟糕,Firefox 越来越偏执。请修复。)

    2013 年 3 月 12 日 下午 11:18

    1. Anthony Caudill

      必须考虑创建文件对话框弹出窗口的方法。如果 Moz 要为此目的提供一个标准弹出窗口,那很好。它的外观可以通过 CSS 定制。用户可以在 Windows 风格的文件夹视图之间切换……它应该像 Windows 一样工作,理想情况下,但根据设备限制,可能只是一个垂直的文件名列表以及它们的大小和创建日期。

      不要强迫网页设计师这样做……用户并不真正关心在他们搜索需要完成工作的文件时,会有动画仙女和他们说话并飞来飞去。(是的,一小部分人确实关心,但他们尖锐的担忧不应该延迟功能的实现。)

      2013 年 3 月 12 日 下午 11:35

  44. Brett Zamir

    至少有一个未提及的用例

    创建通用的文件桌面界面。桌面界面的可扩展性非常糟糕,即使在存在更多变体的操作系统上,也不能使用 JavaScript 来实现它,而即使可以使用,它也可能不标准化,也不可移植到其他操作系统。例如,在 Mac 上,之前有一个很酷的 3D 操作系统界面。使用 enablePrivilege,在我早期的编程实验中,我得到了一个 Mac 风格的列浏览器(在 http://subversion.assembla.com/svn/brettz9/colbrowser/ 中——尚未适应 AsYouWish)。有很多创新和可扩展性的可能性。

    在我们能够在浏览器中完成所有操作(包括使用桌面界面本身设计自己的浏览器 UI)——并具有经过精心设计的默认情况下严格禁用的选项之前,在我看来,它并不真正自由。我认为真正的自由应该是能够使用相同的语言和语法(即 JS)来破解一切。在我看来,我们应该始终追求最好,然后担心如何安全地做到这一点,而不是举手投降地说做不到。它可以做到,而且已经做到了——尽管现在这一切都被设计 Windows、*nix 和 Mac 的人(或者有破解它们的能力的人)所控制。Firefox OS 看起来可能会成为一种积极的方式,至少在移动设备上,将这种控制权带给普通开发者,但它的浏览器和桌面似乎都不支持扩展(即使它可以被破解)。

    顺便说一下,感谢 Jonas 解决了我们许多人关心的这个问题,并分享了你的计划(高层次)细节。

    2013 年 3 月 13 日 上午 3:25

    1. Brett Zamir

      另一个显然没有被文件系统涵盖的用例:功能(虽然可能被 DeviceStorage API 涵盖,如果类型是可扩展的)是在创建文件之前,能够从可预测的命名空间/位置读取或存储数据。例如,如果我要创建一个标准来存储文件格式数据(比如游戏数据),但希望其他开发者能够独立地在他们的 UI 上进行创新,我必须启用自己的网站使用 postMessage,开发者必须依靠我才能访问这些数据。

      这就像 LibreOffice 每次想要访问用户的 OOXML 文件时,都必须通过 Microsoft 的网站一样。

      DeviceStorageAPI 似乎可以解决这个问题。我认为,可以通过细粒度的控制来帮助解决它的安全问题。例如,作为一个用户,如果一个网站明确地要求我授予删除照片的权限(或者我有机会在每次使用某些类型的权限时确认——例如,如果我想要确认每次删除使用,但不想确认读取使用),我就可以根据我对请求网站的信任程度做出更明智的决定。此外,它可以帮助网站提供不同的级别,或者从较低的级别开始访问,例如,请求创建新文件的权限,可以让网站不必克服那么高的信任障碍才能变得有用。

      2013 年 3 月 13 日 上午 3:46

    2. Rob Higgins

      Brett Zamir,恕我直言,我完全不同意你试图实现的目标。如果任何浏览器允许访问我的系统,我都会删除它。你为谁开发?你自己。你试图创建一个只有你会使用的桌面,因为只有你才值得信赖这种权力(或者你是众多不知情者中的一员)。

      一个更聪明的方法是将你的家庭服务器扩展到你的客户端笔记本电脑/平板电脑,并在那里创建一个桌面(我已经做到了,效果很好)。对文件系统的任何访问都在服务器上进行。就是这样。你必须明白,任何桌面“服务”代码都托管在与你自己的电脑不同的电脑上。如果代码托管在与你自己的服务器不同的服务器上,它随时可能发生变化。如果代码可以随时更改,它很容易被用于恶意目的。听说过“中间人”攻击吗?

      看起来你想要编写在本地运行的代码。那为什么还要使用浏览器?是因为那是你已经知道的语言吗?这不是一个好的答案,你会让你的用户感到困惑,并让他们处于危险之中。

      2013 年 3 月 14 日 上午 11:08

      1. Rob Higgins

        另外,我不想要从浏览器中获得“自由”,我想要安全。你要求的实现永远不会安装在任何企业网络中。然后猜猜看,我们将在接下来的 10 年里一直使用 IE 9(至少他们还不傻到疏远他们的目标用户)。

        2013 年 3 月 14 日 上午 12:09

        1. Anthony Caudill

          Brett,你使用 Firefox 已经很多年了,它比任何其他浏览器(除了 Opera)都给了你的浏览器更多的访问你文件系统的权限。

          2013 年 3 月 14 日 上午 12:21

          1. Brett Zamir

            我认为托尼是想在这里跟你说话,罗伯,这是真的。Firefox(和 IE 一样)允许浏览器访问文件系统。Firefox 还允许访问任何其他 API(密码管理器等),只要用户同意。同样,即使在今天没有 AsYouWish,任何远程托管的扩展程序只要要求你安装,仍然可以获得完全的权限访问(正如我提到的,Chrome/Safari/Opera 也一样)。或许要求额外的步骤(Chrome 现在已经做到了)是明智的,即把下载的文件拖放到扩展程序选项卡中(让社会工程变得更难),但他们并没有试图成为唯一能够决定哪些扩展程序可以使用其浏览器安装的“保姆”,从而阻止其浏览器自身的扩展性,我希望他们永远不会这样做。

            2013 年 3 月 14 日 下午 4:49

        2. Brett Zamir

          首先要解决这个问题,IE 已经成为企业网络的一部分多年了,它使用一项名为 ActiveX 的技术,这项技术正是我想重新启用 Firefox 来做的(尽管我希望它能够以更具跨浏览器潜力的方式实现,而且在告知你正在请求哪些类型的权限方面更加细致)。ActiveX 应该默认不启用(甚至应该征求许可),但它是 IE 浏览器的组成部分,已经存在多年了(就像 hta 应用程序一样)。

          Google Chrome 允许远程安装扩展程序(虽然现在需要额外的步骤),Opera 和 Safari 也允许,Firefox 也允许。除了开发者必须管理一个文件打包过程外,它们有什么区别?不从浏览器提供这项功能只会做一件事:限制开发者和用户的便利性和选择权。仅此而已。这不会真正降低安全性。

          事实上,根据情况来看,并且毫不奇怪,似乎一些对 enablePrivilege 消失感到沮丧的用户是小型公司,他们能够以较低的成本雇佣网页程序员,为他们的特定需求创建使用熟悉语言的权限应用程序。

          2013 年 3 月 14 日 下午 4:37

          1. Rob Higgins

            我们的系统是锁定的非常紧密的,我们的用户不能在网站上使用 ActiveX 控件,除非先从管理帐户启用。Firefox 能提供这种管理控制吗?(认真地问,我不知道)如果要共享一台计算机,我认为插件架构(如果要明确列出授予的权限,就像 Chrome 一样)将是最透明的方式来实现这一点,减轻开发者的负担,并让人们像我一样安心(不是说我信任 Mozilla,我只是比信任你更信任 Mozilla)。但我猜想,这一切都取决于个人喜好。

            2013 年 3 月 14 日 下午 4:50

  45. Angelo Borsotti

    罗伯:布雷特不是为自己开发的。至少还有一个人
    他正在为其开发:我。
    我使用了布雷特所完成的事情,它并没有降低
    我正在使用的 Firefox 的安全性,并允许我使用网络实现应用程序
    技术,否则我将不得不恢复到专有、不太
    便携的技术。

    2013 年 3 月 14 日 下午 1:17

    1. Rob Higgins

      所以安吉洛,这段代码在哪里托管?在你的电脑上,还是在布雷特的电脑上?或者更糟的是,在 godaddy 类型的第三方服务器上?

      2013 年 3 月 14 日 下午 1:50

      1. Angelo Borsotti

        罗伯:应用程序托管在我的电脑上,但我可以把它托管在任何
        我信任的 web 服务器上。例如,可以托管在布雷特的电脑上
        因为我信任他。
        附注:我从微软服务器下载了 MS Office。我知道
        Office 可以访问我的文件,并可能破坏任何文件。
        我使用它是因为我信任 Microsoft Office。

        2013 年 3 月 15 日 上午 0:08

  46. Brett Zamir

    1. 我为谁开发?我为我自己开发,也为任何欣赏我创造的人开发。即使你认为没有一个聪明人会信任我个人来设计他们的桌面界面(虽然谢谢你提醒我调整我的旧列浏览器代码作为另一个演示),那么提供给其他人这样做的机会,让他们选择,有什么错呢?人们安装权限可执行文件或远程托管的扩展程序,正是因为他们愿意对他们希望找到一些值得信赖的证据来源进行权衡或信任,并且不想被限制在他们的体验中。我只是让开发人员更容易一步(一步可以产生很大的影响)。

    我不想被个人限制,也不认为任何开发人员应该被限制(包括那些我为其创建工具的开发人员)必须安装服务器。此外,Firefox 本身也具有一些服务器功能。

    2. 是的,我知道远程托管的代码可以随时更改,并且可以被恶意使用。这就是为什么 AsYouWish 默认情况下不允许任何网站请求访问用户,并在用户允许网站请求访问时,在门把手通知中显示强烈的警告。虽然确实如此,正版附加组件的优势在于允许永久安装附加组件的单个版本,而该版本仍然可以从自动更新中限制(与 AsYouWish 网站或当前的“附加组件”不同,它们会提供永久的实时访问,直到你卸载),但 Firefox 扩展程序的首次安装也可能安装恶意代码,与附加组件无关(或以其他方式造成损害)。阻止更新的唯一真正好处是,对于那些可能选择少数完全亲自查看每个远程安装扩展程序版本的源代码的人来说。我建议这样做,但有一些来源(比如朋友或以其信誉建立起来的公司),非偏执的人可能希望给予一点信任(就像所有可执行文件用户一样)。

    是的,对于我们信任的人来说,为我们做一些审查工作当然很方便(尤其是对于托管在那些我们无法轻松做出关于可信度的明智决策但可能提供有用程序的网站上的代码),这就是为什么我希望 Firefox 默认情况下允许这种功能,虽然对可以请求访问的网站进行类似的限制,例如,默认情况下只允许 AMO(但不需要将扩展程序打包成浏览器特定的格式)。

    3. 至于中间人攻击,是的,我知道这种可能性,这就是为什么 AsYouWish 默认情况下只启用 https 或文件协议,并在更改默认设置的选项旁边显示醒目的红色警告。

    4. 至于为什么要使用浏览器来做这件事,有很多原因

    a) 是的,它允许我使用我所知道的语言之一。我认为没有必要再使用另一种语法——甚至一位老 MIT 全额奖学金的朋友也曾经跟我说过,他面临的不同语法之间的干扰令人讨厌。

    b) 它允许那些只知道一种语言的开发人员使用,是的(我再次认为这不是一件坏事)。如果有关于开发的任何势利,那应该是在精通一门语言,而不是精通多种语言(虽然后者对于获得将概念改编成自己的语言的想法并获得其他环境的访问权限来说,在边缘上是不错的)。这就像人类语言;是的,学习更多的语言会让我理解他人的想法,但这并不意味着世界可以让我们省去在掌握一门方便的世界语言用于与我们的母语一起使用(就像各个国家为了团结人民而做的那样,同时允许继续使用地方语言)之后,在我们的黄金时期后,还要苦苦学习语言的需要(尽管不应阻止我们选择这样做)。此外,AsYouWish wiki 试图警告开发人员,这样的创作对他们的用户来说可能是危险的(就像附加组件已经可以做到的一样)——我认为,在网页扩展文档中需要更多关注这一点。

    c) JavaScript 是一门很棒的语言(尽管有一些很大的缺陷),如果 SDK API 能够在所有浏览器中成为标准,那就太好了。就像网络标准一样,我们没有必要用 100 种方式说“苹果”(就像水果一样)。不幸的是,由于开发人员数量较少,而且有些人似乎已经默认接受了这种情况(即使浏览器的标准化也需要一些时间),浏览器在统一扩展 API 方面的压力可能低于网页 API。我不知道这是因为一些浏览器坚决反对这一点,还是仅仅因为缺乏尝试或感知到的开发者兴趣。

    d) 除了在本地运行外,我喜欢有提供(或从其他人那里获得)可信赖的远程托管创作的选择。

    e) 也许最令人信服的原因——使用浏览器还可以提供访问与浏览体验集成的 API(不仅仅是文件 API)的潜在好处。如果我想让我的桌面浏览应用程序让我启动与浏览器共享的相同书签管理器,我可以这样做。或者如果我想实现自己的浏览器界面,我应该能够做到。

    顺便说一下:除了网页沙箱之外,文件访问的另一个用例:为在线 IDE 使用的用 JavaScript 实现的 Git 服务器。

    2013 年 3 月 14 日 下午 6:21

    1. Brett Zamir

      我还有几句话忘记提了

      1) SSJS 提供了我提到的部分好处,但并非全部(此外,我使用的 SDK 也是 CommonJS 友好的)。

      2) 与浏览器附加组件不同,AsYouWish 至少向用户展示了对请求的权限的细致了解(Safari 至少在安装后在“隐私”按钮下显示访问类型,但 AYW 在批准之前就显示)。

      2013 年 3 月 14 日 下午 6:31

  47. Michaela Merz

    现在是时候再发表一下我的拙见。我们是数据安全专业人士,相信我,情况已经很糟糕了。即使采取了所有保护机制,并明确制定了“不要将互联网用于私人目的”的规定,我们仍然在企业环境中的许多计算机上发现各种恶意软件、病毒、木马、漏洞利用和其他不良软件。很明显,对某些人来说,诱惑实在是太大了。

    我们目前建议不要让人们在工作场所访问网络——而是安装专门的计算机,放在大厅、自助餐厅等地方,并且每天都会被擦除数据。

    从我的专业角度来看,我们必须创建更多安全措施,我们必须找到完全禁止访问文件系统的方法——即使是下载、缓存和插件。我们无法跟上现代、高度专业化的漏洞利用方法。如果这种情况持续下去,我们可能会看到越来越多的公司放弃休闲的互联网浏览。

    所以——我的建议是:Firefox 应该有一个模式,允许我们完全阻止所有上传和下载、硬盘缓存和模块(附加组件)安装——通过管理密码进行保护。

    再次——这只是一些试图清理用户每天在工作电脑上留下的混乱的人的意见。

    Michaela

    2013 年 3 月 15 日 上午 2:25

  48. Rob

    布雷特,感谢你的评论,我很高兴我们能够以一种智慧和文明的方式争论我们的观点。我可以告诉你,你对你的观点充满热情,我和你一样,完全理解你的想法。

    对于想要无限制访问文件系统的开发人员,我能给出的最好的建议是学习 PHP。我认为,在服务器上进行此类工作是唯一可行的选择。

    我承认我对 Node.js 一无所知,但是如果你不习惯学习新的语法,也许你应该看看那里。Node.js 都是 JavaScript 服务器端代码。我还是推荐 PHP 比 node 好,因为它是一个成熟的开源标准,而且网上有更多文档。

    至于 git 仓库,再次使用服务器。IMO,这是最容易、最跨浏览器、最有利可图和最安全的方式来做所有你想做的事情。服务器最难的部分是设置 LAMP 堆栈和 Apache 设置,但从长远来看,这非常值得为互联网上编码真正的应用程序而付出。我认为服务器应该负责应用程序的安全,而不是将这项任务交给前端开发人员。

    2013 年 3 月 16 日 下午 1:22

    1. Brett Zamir

      是的,我喜欢并使用 PHP。我喜欢它,因为它
      1)它让人们能够做的事情
      2)正如你所说,跨浏览器
      3)它非深度命名空间嵌套的全局 API(对初学者友好,有时内存负载更轻,尽管 API 中存在一些令人讨厌的不一致之处(例如,“str” 与“string”)。

      但这些原因都不能无限期地证明它优于 JavaScript,包括 Mozilla 作为平台。在我的使用 API (#3) 的范围内,我们有 http://phpjs.org/ 。Mozilla 的平台已经非常强大(#1),就 #2 而言,我同意可以通过鼓励和邀请其他人标准化跨浏览器扩展 API 来解决(或者如果没有,构建一个桥梁来实现,尽管这需要一些积极的维护)。

      此外,正如安吉洛可能在关于性能的回复中提到的那样(更不用说对自己或想要训练的人的便利性),为什么要添加另一层呢?

      就你的安全论点而言,PHP 也显然可以被利用。我同意你,无论何时何地,安全任务都不应该交给前端开发人员,而是尽可能地,增强 SDK API(例如,让任何包含文本转义以防 XSS 的默认行为)应该和对 PHP 做同样的事情一样可行(例如,使用克服 PHP 本身弱点的一个框架)。

      解放你的思想,意识到万物的合一。 :)

      2013 年 3 月 16 日 下午 6:51

  49. Angelo Borsotti

    Rob:让我们比较一下你提出的解决方案与 Brett(和我的)提出的解决方案,就我理解你的提议而言。
    你的:使用浏览器托管客户端(html+javascript,我想,ajax)和 Web 服务器托管服务器端部分(php、nodes.js 等)的客户端-服务器模式来实现应用程序。
    我们的:使用浏览器(html+javascript)来实现应用程序,该浏览器安装了插件。
    显然,第二种方法要便宜得多,无论是在要学习的语言方面,还是在要编写的代码量方面,更不用说性能以及安装和配置 Web 服务器的必要性了。

    2013 年 3 月 16 日 下午 3:34

  50. Brett Zamir

    实际上,仔细想想,"标准化跨浏览器扩展 API" 项目可能应该包括加入 CommonJS。

    2013 年 3 月 16 日 下午 6:53

  51. Rob

    我将重申我的最后想法,并退出对话,因为我认为我已经说了一切。我希望我的想法能激发人们进行自己的研究,并做出明智的决定。

    我的主要观点是,你是在为自己开发。你希望本地代码在本地环境中以完整权限运行。好的。给他们。见鬼,也许应该有人创建一个专门用于此目的的浏览器(hta?)。在你让该代码从服务器访问(并享有特权)之前,这与我无关。在那一点上,我认为你正在使人们面临恶意攻击的风险,而这种攻击肯定会发生。如果你注意到,在我的第一篇文章中,我声明我不会安装任何 Firefox 插件。我理解风险并避免它。也许我很偏执,但我也不得不承认,比我聪明得多的人正在积极地试图利用浏览器的弱点,我们现在正在说话。不是说我认为有人真的想监视我(真的,没有很好的理由,所有有趣的东西都在 facebook 上),而是存在我无法控制隐私的可能性。

    我只想要最稳定、最安全、最兼容的开发平台,这就是我们许多人梦想互联网能够成为的样子。这将需要多种技术来实现(html、css、javascript、php),但它们都是开源的,应该被视为同一个平台(LAMP 堆栈)。我一直设法避免了 adobe flash,并专注于开源技术,但如果你想在一个地方得到所有东西,也许你应该看看 flash?无论如何,感谢你进行的智能对话和表达我的想法的论坛。

    Rob

    2013 年 3 月 17 日 上午 10:43

    1. Brett Zamir

      Rob,也感谢你进行的智能和文明的互动,以及坦率表达你担忧的意愿。

      我也打算将此作为最后一条帖子,但任何希望继续对话的人都可以打开一个问题:https://github.com/brettz9/asyouwish/issues

      我正在部分为自己开发,部分为他人开发。想想插件开发。它是在本地运行,并具有完整权限,但人们想要分享他们的创作。唯一的区别是 AYW 帮助你避免打包文件,理论上可以实现跨浏览器,还可以让你选择插件是在每次浏览器重启时运行,还是仅在用户需要时运行(例如,你可以将其添加为书签)。是的,代码可以更改,但插件代码也可以更改(就像 Web 应用程序一样,不过也许可以开发一些本地安装机制来导入其他网站,并在批准升级之前阻止这种情况)。如果你不信任,就不要批准(或者保持默认行为,即不允许网站询问你批准,除非你手动想要进入添加你信任的网站)。

      我可以理解你避免安装插件的原因。我认为 SDK 无需重启的插件(所有需要特权模块的操作都需要通过静态分析)应该更容易、更安全地审查(AYW 更进一步,通知用户这些模块是什么)。但即使是最能干的人,以及 AMO 上的自动检测工具,我认为没有任何强大的东西可以 100% 防错,需要人工监督。

      但如果像 AsYouWish 这样的插件被添加到 Firefox(我希望它可以被添加),只要 AsYouWish 代码与 Firefox 的其他代码一样经过严格的研究和测试(如果 AYW 的插件批准流程的时间长度说明了什么,它至少作为一个插件,它将被!)你个人不会受到影响,因为默认行为是不允许任何网站请求特权,更不用说授予特权了。

      你对其他人的担忧是一个单独的问题,因为存在社会工程的可能性。但如果有人在他们的博客上写

      如何制作鸡蛋沙拉三明治
      1. 获得一把刀。
      2. 刺伤你的手指。

      如果有人愚蠢到会遵循这个步骤,我们是否应该在所有网站上添加扫描器,以防止人们阅读“刺伤”这个词?

      或者,对于一个不那么极端的例子,社会工程如何

      1. 下载这个 exe 文件来“升级”你的 Firefox。

      对于愚蠢和保护人们免受自己伤害,都存在一个范围。如果我们禁止汽车,我们可能会保护人们,但要付出什么代价?Firefox 始终很好地运行一些危险的 about:config 首选项,这些首选项也可能容易受到社会工程的攻击。即使某个可怜的家伙因此而被利用,尽管坦率地说,这种坦率是令人遗憾和不受欢迎的,但我认为,IMO,整个网络不应该因为这种情况而停滞不前(我认为,如果人们对自己诚实,他们也会同意社会工程的风险是不可避免的)。

      我认为解决方案是三方面的

      1)提供强大的、易于开发/分发的开箱即用的功能(但已禁用),以便想要启用这些功能的开发人员及其用户可以快速从中受益。
      2)使默认行为偏执,以保护用户免受自己伤害,并帮助谨慎的人避免担心需要进行配置更改。
      3)使覆盖默认行为不那么琐碎(但不能完全不可能与想要跨越障碍的人分享步骤),并充分警告用户以尽量减少社会工程。

      Flash 可能是我想要看到的最近、最常用的类似物。如 AYW 的自述文件所示,"我希望这真的能变成一个浏览器认可的 API,默认情况下可用。插件本身是用 JavaScript 编写的,因此希望足够容易地进行内省。AsYouWish 不需要特殊的文件格式、HTML 对象标签等。"此外,这可以允许开发超出 Flash 允许的范围(例如,开发一个导入你现有标签的浏览器)。

      2013 年 3 月 18 日 下午 6:50

这篇文章的评论已关闭。