在 Mac 上的 tauri 应用程序中下载 blob 时出现问题

问题描述 投票:0回答:1

我有一个端点,它返回一个 blob 的下载链接。然后,我创建一个锚标记并单击它以下载该锚标记的内容。在我的浏览器和 Windows 上它运行良好。单击锚标记,然后下载内容。在我的 Mac 桌面 tauri 应用程序中,它不起作用。我收到此错误:“锚点上的下载属性被忽略,因为其 href URL 具有不同的安全来源”。

如何让它在 Mac 上也能工作?

这是代码:

fetch(downloadlinkResponse.some.downloadLink)
            .then(response => response.blob())
            .then(blob => {
                var link = document.createElement("a");
                //link.href = URL.createObjectURL(blob);
                link.href = downloadlinkResponse.some.downloadLink;
                link.download = downloadlinkResponse.some.name;
                document.body.appendChild(link);
                link.click();
                link.remove();
            })
            .catch(error => console.error(error));

当我 console.log link.href 时,将其复制并粘贴到我的浏览器中,内容会在 Safari 和 Chrome 中下载。

我还尝试创建一个 ObjectURL,如您所见,但这会导致不同的 Webkit 错误。

我遇到的每一个可能的“解决方案”都表明它与 CORS 相关,并且我在我的服务器上尝试了大量与 CORS 相关的东西,但似乎没有任何效果。

锚标记错误让我认为这是一个前端问题,但我不知道如何解决它。

javascript download anchor desktop-application tauri
1个回答
0
投票

站在同样的问题面前,我现在为 Tauri beta 解决了它。这可能对您有帮助:

我的新进口:

import { save } from '@tauri-apps/plugin-dialog';
import { writeTextFile, writeFile } from '@tauri-apps/plugin-fs';

我的 func 使用我的 api 中的 blob:

generateMonthlyConcerts(): void {
    this.eventService.getMonthlyConcertPdf(this.starttimeOfMonth, this.endtimeOfMonth).pipe(take(1))
      .subscribe(async blob => {
        const readableStream = blob.stream();
        const stream = readableStream.getReader();
        let data: Uint8Array;
        while (true) {
          let { done, value } = await stream.read();
          if (done) {
            console.log('all blob processed.');
            break;
          }

          data = value;
        }
        const path = await save({
          defaultPath: 'Konzertprogramm_' + formatDate(this.starttimeOfMonth, 'MMMM_y', 'de-DE') + '.pdf',
          filters: [
            {
              name: 'PDF Filter',
              extensions: ['pdf']
            },
          ],
        });
        await writeFile(path, data);
      });
  }
© www.soinside.com 2019 - 2024. All rights reserved.