【问题标题】:How to share a file using Web Share Target API?如何使用 Web Share Target API 共享文件?
【发布时间】:2021-04-16 16:15:38
【问题描述】:

如何使用 Web Share Target API 共享文件?

当我尝试从手机上的图库应用共享文件时,我设法让我的 Progressive Web App 出现。我的问题是如何获取文件并将其发送到服务器或使用共享文件填充带有 type="file" 的 HTML 输入?

这就是我现在拥有的

在 manifest.json 中

    "share_target": {
    "action": "/qtransfer-p/send.php",
    "method": "POST",
    "enctype": "multipart/form-data",
    "params": {
      "title": "name",
      "text": "description",
      "url": "link",
      "files": [
        {
          "name": "fileToUpload",
          "accept": [".pdf", ".png", ".jpeg", ".doc", ".docx", ".pdf", ".xls", ".xlsx", ".txt", ".mp4", ".mp3", ".wav", ".rar", ".zip"]
        }
      ]
    }
}

在 sw.js 中(服务工作者)

self.addEventListener('fetch', event => {
  const url = new URL(event.request.clone().url);
  // If this is an incoming POST request for the
  // registered "action" URL, respond to it.
  if (event.request.method === 'POST' &&
      url.pathname === '/qtransfer-p/send.php') {
      event.respondWith(Response.redirect('/qtransfer-p/send.php'));
      event.waitUntil((async () => {
        console.log("1");
        const data = await event.request.clone().formData();
        console.log("2");
        console.log(data);
        const client = await self.clients.get(event.resultingClientId || event.clientId);
        console.log("3");
        const file = data.get("fileToUpload");
        console.log("file", file);
        client.postMessage({ file, action: 'load-file' });
      })());
      console.log("ok");
      return 0;
  }
});

现在,当我分享照片时,我会进入控制台:

1

好的

Uncaught (in promise) TypeError: Failed to fetch

所以我认为问题出在“const data = await event.request.clone().formData();”上。

请有人帮忙!我试图解决这个问题 2 周!

【问题讨论】:

    标签: javascript progressive-web-apps service-worker web-share


    【解决方案1】:

    如果您想将文件直接发送到您的网络服务器,您可以跳过 service worker 的参与。

    您当前的manifest.json 设置将导致POST 请求被发送到您来源的/qtransfer-p/send.php,编码为multipart/form-data,只要有人将支持的文件共享到您安装的PWA。

    只要您不在服务人员中拦截该请求,我相信它会像任何其他 HTTP POST 一样直接发送,并且可以在服务器端进行处理。

    【讨论】:

    • 我明白这是如何工作的,但是当我尝试在 upload.php 中获取表单数据(实际加密并上传到服务器的文件 + 一些 SQL 内容)时,我似乎无法制作这行得通。更准确地说:send.php 有一个表单,它发送一个带有选定文件的 POST。 upload.php 接受该 POST,其中包含文件名和内容,然后将文件上传到我服务器上的文件夹。那么我怎么能,而不是手动选择 send.php 上的文件,我会按共享(在画廊应用程序中)和 upload.php 获取文件,就像它在 send.php 中选择的一样(在 )?
    • 现在在 upload.php 我有类似$filename = basename($_FILES["fileToUpload"]["name"]);
    • 我认为将您的网络应用清单中的action 更改为/path/to/send.php 将完成您的描述?您的action URL 接收到的POST 请求的详细信息,包括编码类型和字段名称也由您的Web 应用清单决定。
    • 好吧,我做到了,但似乎仍然无法正常工作。我的浏览器向upload.php 注册了POST 请求,但没有发送数据。我的 PHP 是正确的,所以我真的认为问题出在清单的某个地方。没有通过那个POST发送数据
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-06-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多