如何在 PWA 中显示共享照片?

How to display shared photo in PWA?

我已经成功地将我的 PWA 添加到我设备的共享选项中,问题是我不知道如何receive/display 我的 PWA 中的共享照片.

share_target 在 manifest.json

"share_target": {
      "action": "/photos/shared",
      "method": "POST",
      "enctype": "multipart/form-data",
      "params": {
        "files": [{
            "name": "file",
            "accept": ["*/*"]
        }]
      }
    }

我正在使用 CodeIgniter,所以我添加了 photos/shared 作为路由

$route['photos/shared']['post'] = 'webapp/PhotosController/sharedPhoto';

并希望在我的控制器中接收 post 共享照片的数据

public function sharedPhoto () {

            echo "<pre>";
                die(var_dump( $_POST )); // empty!
            echo "</pre>";

    }

但是,不幸的是它是空的。

经过一番阅读,我发现了这个:

The foreground page cannot process this data directly. Since the page sees the data as a request, the page passes it to the service worker, where you can intercept it with a fetch event listener.

this website, so I've added this code to my service worker(I followed this tutorial)

self.addEventListener('fetch', function(event) {
  if (event.request.clone().method === 'POST') {
       const url = new URL(event.request.clone().url);
       console.log( 'URL' );
       console.log( url );
       if (event.request.clone().url.endsWith('/photos/shared') || url.pathname == '/photos/shared') {
            event.respondWith(Response.redirect('./'));

            event.waitUntil(async function () {
                const data = await event.request.formData();
                console.log( data );
                const client = await self.clients.get(event.resultingClientId);
                console.log( client );
                const file = data.get('file');
                client.postMessage( {file});
            }());
       } else {
       // do other non related stuff
       }

之后,我将 post 消息的事件侦听器添加到我的 javascript 文件

    navigator.serviceWorker.addEventListener('message', event => {
    // this is triggered but file is always empty
    const file = event.data.file;
    const img  = new Image();
    const url = URL.createObjectURL(file);
    img.src = url;
    document.body.append(img);
  });

但是,我无法在我的应用程序中显示图像,文件始终为空。

好的,清单和服务工作者的最新更改(我已经更新了我的问题)确实有效。我唯一需要做的就是更改消息事件侦听器中的代码,以便能够看到图像。

navigator.serviceWorker.addEventListener('message', event => {

 const file = event.data.file;
 const img  = new Image();
 const url = URL.createObjectURL(file);
 img.src = url;
 $("body").empty();
 $("body").append(img);
 $("body").append(url);
 $("body").append('<h1>test</h1>');

});

现在我可以在我的应用程序中访问照片,我终于可以对其执行必要的操作了。