从 React Native WebView 下载文件

wun*_*uno 5 react-native

背景

我正在使用 WebView 将用户导航到下载文件的特定页面。我将 Javascript 注入到 WebView 中以模拟点击下载文件链接。使用 Javascript 单击链接后,文件就会在设备上打开。

我正在尝试查找将文件下载到设备的信息,而不是在 WebView 中打开它。

最初,我在 IOS 中构建了这个应用程序,我可以将数据作为 blob 下载,然后使用 API 将其发送到我的服务器。我想模拟相同类型的功能。

例子

// 这将在 WebView 中打开文件

  const injectedJavaScript = `var confirmLink = document.querySelector("a[href='/file/download']");
      if(confirmLink) { window.location.href = confirmLink.href; }
      `;
      this.setState({ step: "complete" });
      this.webview.injectJavaScript(injectedJavaScript);
Run Code Online (Sandbox Code Playgroud)

问题

如何在不通过手机打开该文件的情况下使用该文件?理想情况下,我希望将文件作为 blob 进行处理,但是,我也很乐意将文件下载到手机的存储中,然后能够从那里使用它。

wun*_*uno 0

回答 -

从流中读取文件并将其作为 base64 使用。您可以将文件转换为 base64 并将其移动到您想要的任何位置。

例子 -

此示例是我注入 JavaScript 以访问 Web 服务器上的文件。该文件被转换为 base64 字符串。然后我将该文件发布到我的 API,在那里我将其转换回服务器上的文件。然后该文件位于我的服务器上。

const injectedJavaScript = `
      fetch("https://www.example.com/somepath.do?language=en", {
        method: "GET",
        headers: new Headers({
          Accept:
            "text/html,application/xhtml+xml,application/xml;q=0.9,image/webp,*/*;q=0.8",
          "Accept-Encoding": "gzip, deflate, sdch, br",
          "Accept-Language": "en-US,en;q=0.8",
          Connection: "keep-alive",
          Referer:
            "https://www.example.com/somepath.do",
          "User-Agent":
            "Mozilla/5.0 (iPhone; CPU iPhone OS 10_3_1 like Mac OS X) AppleWebKit/603.1.30 (KHTML, like Gecko) Mobile/14E8301",
          "Content-Disposition": "attachment; filename=someFile.txt"
        })
      })
        .then(response => {
          response.body.getReader().read().then(function(result) {
             return btoa(String.fromCharCode.apply(null, result.value));
         }).then(function(b64) {
             fetch("https://api.example.com/api/v1/endpoint", {
               method: "POST",
               headers: {
                 "Content-Type": "application/json"
               },
               body: JSON.stringify({
               data: b64
               })
             }).then(res => {
               console.log(res);
             }).catch(e => {
               console.log(e);
           });
        });
      });
        `;
Run Code Online (Sandbox Code Playgroud)