21

对于离线存储数据,WebApp 可以使用:

但显然没有文件存储。当然,也有基于 manifest 的缓存,但它只是一个缓存,不应该用作用户数据存储。

这是否意味着 WebApp 的用户被迫使用某种云文件存储?

有没有办法在用户的本地机器上保存大文件?或者也许可以通过某种方式选择本地文件夹 Web 应用程序可以用来存储用户数据?

编辑. 安全。HTML5 已经能够将大部分数据写入用户的本地机器。如果浏览器将提供另一种基于文件的抽象来存储数据,我看不到任何安全问题。它可以是一些虚拟机、虚拟文件系统等等。

嗯,我认为,可以编写 JS 文件系统并将其存储为 SQL 中的 blob ......

类似的 问题

更新:嗯...最近我发现 了这个这个。也许这就是我正在寻找的……是的,它就是!请参阅下面的答案。

4

7 回答 7

17

终于,我找到了!这是答案:

我将拥有具有读/写访问权限的 DOMFileSystem 请写:

Google 的 Eric Uhrhane 一直致力于 文件 API:目录和系统规范的工作草案,该规范定义了一组 API,以创建一个沙盒文件系统,Web 应用程序可以在其中读取和写入数据。

哇!我太激动了!

于 2010-12-12T14:09:54.753 回答
6

当用户想要将localStorage文档和API 保存到磁盘时,为什么不使用它呢?FileWriter大多数人习惯于在保存文档时看到弹出的保存对话框。

我能想到的唯一一种保证无用户访问FileWriterAPI 的场景是自动保存功能,但自动保存localStorage也一样好。

于 2010-12-07T14:45:22.050 回答
3

如果您愿意使用 Flash,有一种方法可以将相对较大的文件保存到用户硬盘。查看下载:

http://www.bitrepository.com/downloadify-client-side-file-generation.html

Downloadify 允许您将数据发送到 SWF 并让该 SWF 在用户计算机上创建一个文件。我的建议是通过您列出的方法之一存储数据,Webstorage、sqlite 数据库等。将所有资产(包括 SWF)放在清单文件中,以便将所有内容本地缓存到浏览器。然后,您可以从您的数据库或网络存储中提取信息并使用 SWF 创建您需要的文件。

我不确定您是否能够将这些文件读回您的 Web 应用程序。

保存数据的另一种选择是使用带有数据 URI 方案的链接标签。但是,我不确定目前是否所有主要浏览器都支持它。

于 2010-12-05T04:23:01.407 回答
1

出于安全原因,您不能将文件写入用户的本地文件系统,以防它被邪恶的人用于邪恶目的。

这不太可能改变,这是一件好事。

于 2010-10-15T15:15:07.070 回答
1

HTML5 FileSystem API 开始登陆 Chrome 8 并且到目前为止已经相当完整(Chrome 11)。

这里有一个很好的教程:http: //www.html5rocks.com/tutorials/file/filesystem/

于 2011-05-18T17:23:53.810 回答
0

http://fsojs.com有效地包装了 FileSystem API,如果您想要一个简单的解决方案

于 2014-02-28T14:19:50.420 回答
0

正如其他人在这里提到的,FileWriterFileSystem API 可用于从浏览器选项卡/窗口的上下文将文件存储在客户端计算机上。

但是,您应该注意与这些 API 有关的几件事:

  • API 的实现目前仅存在于基于 Chromium 的浏览器(Chrome 和 Opera)中
  • 这两个 API 均已于 2014 年 4 月 24 日脱离 W3C 标准轨道,并且现在是专有的
  • 将来有可能从实现浏览器中删除(现在是专有的)API
  • 沙箱(磁盘上的一个位置,文件不能产生任何影响)用于存储使用 API 创建的文件
  • 使用虚拟文件系统(一种目录结构,不一定以与从浏览器中访问时相同的形式存在于磁盘上)表示使用 API 创建的文件

尚未提及的IsolatedStorage也允许从选项卡/窗口上下文中进行文件 i/o,但它仅通过 Silverlight 提供,并且需要使用托管代码才能访问。它与 FileSystem 一样,也存在于沙箱中并使用虚拟文件系统。

鉴于基于 Chromium 的浏览器和 Silverlight 的高市场渗透率(有趣的是,此类浏览器已经放弃了对它们的支持),您可能会发现使用上述第一种方法的解决方案在客户端计算机上可用。

BakedGoods是一个 Javascript 库,它建立了一个统一的接口,可用于在所有原生(包括 FileSystem)和一些非原生(包括独立存储)存储设施中进行常见的存储操作,就是这种解决方案的一个示例:

//Write file to first of either FileSystem or IsolatedStorage
bakedGoods.set({
    data: [{key: "testFile", value: "Hello world!", dataFormat: "text/plain"}],
    storageTypes: ["fileSystem", "silverlight"],
    options: {fileSystem:{storageType: Window.PERSISTENT}},
    complete: function(byStorageTypeStoredItemRangeDataObj, byStorageTypeErrorObj){}
});

只是为了完全透明,这个人在这里维护 BakedGoods :)。

于 2016-07-07T17:22:08.327 回答