【问题标题】:How to refresh pictures in the service worker如何在 service worker 中刷新图片
【发布时间】:2019-08-08 19:50:23
【问题描述】:

我正在使用 Angular 7 设置 PWA。这是我的问题: 如果用户登录应用程序,他可以上传个人资料图片。图片会上传到 /assets 文件夹,由 service worker 缓存。

据我了解服务工作者,应用程序本身通过项目主文件夹中的文件名识别更新。如果文件名发生变化,Service Worker 将获得新版本。

也许您现在看到了问题:如果用户上传图片,则不会更改文件名,因为它不是来自 Angular 项目的更新。因此,用户会长时间看到他的“旧”个人资料图片,或者如果他刷新浏览器缓存。

我尝试使用 php 在 angular assets 文件夹中上传个人资料图片。这是正确的方法吗?

这段代码对我来说效果很好,但我不确定这是否是使用 PWA 保存图片的正确方法。我希望 Service Worker 缓存我的图片,但如果用户上传图片,我希望立即刷新。

$path = '../assets/img/profile_pictures/';

if (isset($_FILES['file'])) {
    $originalName = $_FILES['file']['name'];
    $ext = '.' . pathinfo($originalName, PATHINFO_EXTENSION);
    $generatedName = $_POST['id'];
    $filePath = $path . $generatedName . '.png';

    if (!is_writable($path)) {
        echo json_encode(array(
            'status' => false,
            'msg' => 'Destination directory not writable.'
        ));
        exit;
    }

    if (move_uploaded_file($_FILES['file']['tmp_name'], $filePath)) {
        echo json_encode(array(
            'status' => true,
            'originalName' => $originalName,
            'generatedName' => $generatedName
        ));
    }
} else {
    echo json_encode(
        array('status' => false, 'msg' => 'No file uploaded.')
    );
    exit;
}

【问题讨论】:

  • 为什么图片保存在apps文件夹目录而不是db?
  • 我想我只是不知道存储图片的最佳做法是什么。前端文件系统(如 Angular 资产文件夹)、后端文件系统或在数据库中作为 blob。

标签: angular browser-cache angular-service-worker


【解决方案1】:

听起来您想要实现的是允许用户更新他们的个人资料图片。这不应该存储在 Angular 前端的任何地方——它应该存储在后端数据库的某个地方,然后当用户转到包含页面时,你会发出加载该图片的请求。

这样,他们每次访问该页面时,都会对数据提出新的请求。除非他们没有互联网连接;在这种情况下,Service Worker 将返回其最新的缓存图像(如果您已将查询 URL 设置为缓存在 ngsw-conf.json 中)。

如果您不想让自己的后端服务来执行此操作;您可以使用诸如 Firebase 之类的服务,该服务具有多个用于与 Angular 通信的库。你可以在这里查看代码示例:https://firebase.google.com/docs/storage/web/upload-files

【讨论】:

  • 这正是我想要的。我有一个 laravel 后端服务。最好将图像保存为数据库中的 blob 将其保存在 laravel 项目中的文件夹中?
  • @Iloivar 绝对将其保存为数据库中的 blob。效率更高,并允许您将其包含在您可能需要的任何查询中。它更易于维护。想象一下,如果 Facebook 将每个人的照片都存储在一个文件夹中——我们永远也得不到它们!
  • 我考虑了你的答案并用谷歌搜索了一下。我不确定这是否是在数据库中存储图像的最佳方式。通过网络的流量会非常高。如果图片在网络服务器上,而我只是在 img 标签的 html 中“调用”它们,则没有流量。它是否正确 ?但是,如果图像在网络服务器上,我会遇到服务人员和更新图片的问题。我很迷茫。 :-D
  • 将图像存储在 assets 文件夹中的方法是不可扩展的 - assets 文件夹用于存储字体、静态图像(即您的徽标)等内容。如果有很多请求,流量会很高——这就是为什么我建议使用诸如 firebase 之类的服务,因为它可以降低您的成本。我会说将用户图像存储在资产文件夹中确实是一种不好的做法 - 避免这样做,即使它很容易,因为它很容易(短期)
猜你喜欢
  • 2020-11-20
  • 1970-01-01
  • 1970-01-01
  • 2020-04-14
  • 2017-06-14
  • 1970-01-01
  • 1970-01-01
  • 2018-03-12
  • 1970-01-01
相关资源
最近更新 更多