我有一个端点,它返回一个 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 相关的东西,但似乎没有任何效果。
锚标记错误让我认为这是一个前端问题,但我不知道如何解决它。
站在同样的问题面前,我现在为 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);
});
}