如何在 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>');
});
现在我可以在我的应用程序中访问照片,我终于可以对其执行必要的操作了。
我已经成功地将我的 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>');
});
现在我可以在我的应用程序中访问照片,我终于可以对其执行必要的操作了。