【问题标题】:how to store large files (pdfs) into the browser file system如何将大文件(pdf)存储到浏览器文件系统中
【发布时间】:2015-06-29 16:01:54
【问题描述】:

背景:

我已经构建了一个离线 HTML5 应用程序,它使用 pouchdb 将一些数据存储到本地浏览器数据库中。

现在需求发生了变化,我必须将大型 pdf 文档(大约 200 个,每个大小为 5mb - 8mb)存储到本地浏览器中,以便用户可以在需要时离线查看。

问题: 我认为使用 pouchdb 将从服务器接收到的这些大型文档放入我的浏览器数据库中并不是一个好主意。

我想知道是否有办法将这些文档以某种方式放入我的设备中,然后获取指向本地设备内位置的 url 引用?

【问题讨论】:

    标签: javascript html couchdb local-storage pouchdb


    【解决方案1】:

    在您的离线清单中包含 PDF,以便它们与应用程序的其余部分一起缓存。然后你只需使用你的正常 URL 来引用它,它就可以从离线应用缓存中得到满足。


    下面是你的问题:

    当应用程序在浏览器中加载时,我通过清单文件将相关页面的详细信息存储到浏览器中。当用户点击“同步”按钮时,我与服务器通信并获取与用户关联的所有 pdf。如果我必须使用清单来保存这些 pdf,那么我该怎么做呢?.....清单已经存储了

    我们做类似事情的方式是这样的:我们为用户离线的事情(例如一天的约会)设置了单独的页面,并有一个完全由客户端数据驱动的列表页面,其中列出了这些页。以下是它的工作原理:

    当用户想要离线查看他们正在查看的内容时,他们单击一个按钮,该按钮会打开一个 URL,其中包含告诉服务器他们想要什么的信息(例如,example.com/offline/stuff-saying-what-they-want-here/),然后服务器会生成一个带有该信息的页面嵌入其中的数据以及页面清单及其所需的任何资产。因此,此时,该信息可在该 URL 上离线使用。加载时,页面会在localStorage 的列表中注册自身,并提供页面描述及其 URL。

    列表页面(例如,example.com/offline/list/)有自己的清单和资产,它们不会经常更改,因为它完全由 localStorage 信息驱动。它显示了他们离线的东西的列表以及指向它们的链接。这主要是为了方便用户,以防他们忘记为离线的个别事物添加书签;例如,他们的想法是他们会为列表添加书签一次,而不必担心为单个页面添加书签。 (他们可以翻阅他们的历史,但这很痛苦。)列表页面通过在加载时从localStorage 获取已知页面列表并订阅storage 事件来保持自己的最新状态,所以如果您在列表打开时在其他选项卡中加载其他页面,它会看到它们到达并更新其列表。

    因此,在不了解您的应用程序的情况下,听起来您的主页可能类似于列表页面,单击“同步”可以打开 PDF 页面,即时生成清单,并且该页面可以注册localStorage 中的 PDF 与我们处理离线页面的方式一样,因此主页可以正确显示其状态。

    显然,实际的 appcache 和我们的 localStorage 列表有可能不同步;如果用户清除 appcache(这将使我们列出无法真正离线查看的内容)或清除 localStorage(这将不会列出他们可以离线查看的内容),我们将无能为力,但我们有.用户大多不这样做,而且经常这样做。

    在未来,您将通过service workers 获得更多更多粒度和控制,但现在由于service worker support is very thin on the ground so far,我们被困在了 appcache 和它定义离线资产的方式相当乏味。

    【讨论】:

    • 感谢您的快速回复。我的 pdf 是动态的和特定于用户的。我之前不知道用户关联的 pdf。
    • @user1455719:这不一定是问题,只是意味着您必须生成清单以响应特定请求。我们在我开发的一个应用程序中做到这一点,用户可以在该应用程序中离线获取约会列表; URL 包含搜索信息,并相应生成页面(其中包含约会数据)和清单。
    • 我的应用程序基本上是一个 angularjs 应用程序。当应用程序在浏览器中加载时,我通过清单文件将关联页面的详细信息存储到浏览器中。当用户点击“同步”按钮时,我与服务器通信并获取与用户关联的所有 pdf。如果我必须使用清单来保存这些 pdf,那么我该怎么做呢?.....清单已经存储了
    • @user1455719:我已经更新了我们如何处理类似问题的答案。 HTH。
    【解决方案2】:

    T.J. Crowder 是对的:如果您的 PDF 是静态的并且事先知道,那么 AppCache 是您的最佳选择。不幸的是,这确实意味着当用户第一次加载网站时,每个 PDF 都会保存在用户的浏览器中,但也许这就是您想要的。

    如果 PDF 是动态的并且事先不知道,那么是的,您可能会看到带有 5MB 附件的 PouchDB 的性能问题。但是,如果您想尝试一下,请查看PouchDB attachmentsblob-utilblobUtil.createObjectURL() 正是您正在寻找的“本地 URL”。

    【讨论】:

    • 感谢 nlawson,只是想知道是否可以使用 fileApi 将这些 pdf 存储到浏览器沙箱文件系统。或者,如果我使用 pouch db 附件,那么我们是否有任何限制(有没有办法可以找出浏览器数据库中还有多少空间用于进一步存储)
    • “不幸的是,这确实意味着当用户第一次加载网站时,每个 PDF 都将保存在用户的浏览器中......” 不,它没有。这意味着加载特定于具有特定 URL 的给定请求的 PDF。因此,请确保请求包含相关信息,以便返回正确的 PDF。
    • 啊,当然,我在考虑单页环境。在多页面环境中,您肯定可以拥有不同的 AppCache 清单。 :)
    • user1455719:至于“浏览器沙盒文件系统”,FileSystem API 仅在 Chrome 中且已弃用:caniuse.com/#feat=filesystem
    • 我的应用程序是一个 angularjs 应用程序。当页面初始加载时,我使用清单将相关页面存储到浏览器中。是否可以用新的清单更新已经存储的清单
    猜你喜欢
    • 1970-01-01
    • 2022-08-10
    • 1970-01-01
    • 2012-07-02
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-07-05
    相关资源
    最近更新 更多