You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor WebAssembly中如何在新标签页打开文件流?

Blazor中调用API获取PDF流并在新标签页打开的解决方案

方法一:直接使用HTML 标签(最简单)

如果你的API不需要额外前置逻辑(比如权限验证),直接用<a>标签指向API地址,设置target="_blank"就能在新标签页打开PDF:

<!-- 无参数情况 -->
<a href="/api/PdfGenerator" target="_blank" class="btn btn-primary">打开PDF</a>

<!-- 带参数情况,比如传递文档ID -->
<a href="/api/PdfGenerator?documentId=@YourDocumentId" target="_blank" class="btn btn-primary">打开PDF</a>

这种方式由浏览器直接发起请求,自动处理PDF展示,无需额外JS或C#逻辑。

方法二:通过C#逻辑+JS处理(适合需要前置操作的场景)

如果需要先执行Blazor逻辑(比如验证权限、组装参数),再打开PDF,可以结合HttpClient和IJsRuntime实现:

步骤1:Blazor组件代码

@inject HttpClient Http
@inject IJsRuntime jsRuntime

<button @onclick="OpenPdfInNewTab" class="btn btn-primary">打开PDF</button>

@code {
    private async Task OpenPdfInNewTab()
    {
        // 调用API获取PDF字节数组
        var pdfBytes = await Http.GetFromByteArrayAsync("/api/PdfGenerator");
        
        // 调用JS方法处理字节数组并打开
        await jsRuntime.InvokeVoidAsync("openPdfFromBytes", pdfBytes);
    }
}

步骤2:添加JS方法

在wwwroot/index.html(WebAssembly)或Pages/_Layout.cshtml(Server)的<script>标签中添加以下JS代码:

function openPdfFromBytes(pdfBytes) {
    // 将字节数组转换为PDF格式的Blob
    const pdfBlob = new Blob([pdfBytes], { type: "application/pdf" });
    // 创建临时URL指向Blob
    const blobUrl = URL.createObjectURL(pdfBlob);
    // 在新标签页打开URL
    window.open(blobUrl, "_blank");
    // 延迟释放临时URL,避免内存泄漏
    setTimeout(() => URL.revokeObjectURL(blobUrl), 100);
}

方法三:处理需要授权头的API

如果API需要携带授权头(比如Bearer Token),<a>标签无法直接设置请求头,可通过HttpRequestMessage手动添加头信息:

@inject HttpClient Http
@inject IJsRuntime jsRuntime
@inject ITokenProvider TokenProvider // 假设你有获取Token的服务

<button @onclick="OpenPdfWithAuth" class="btn btn-primary">打开带授权的PDF</button>

@code {
    private async Task OpenPdfWithAuth()
    {
        var request = new HttpRequestMessage(HttpMethod.Get, "/api/PdfGenerator");
        // 添加授权头
        var token = await TokenProvider.GetTokenAsync();
        request.Headers.Authorization = new AuthenticationHeaderValue("Bearer", token);
        
        // 发送请求并获取响应
        var response = await Http.SendAsync(request);
        response.EnsureSuccessStatusCode(); // 确保请求成功
        
        var pdfBytes = await response.Content.ReadAsByteArrayAsync();
        await jsRuntime.InvokeVoidAsync("openPdfFromBytes", pdfBytes);
    }
}

为什么你的原代码无效?

你之前的代码jsRuntime.InvokeVoidAsync("open", "File_Stream", "_blank")无效,是因为"File_Stream"不是浏览器可识别的有效URL或资源路径,浏览器无法定位到对应的PDF资源。


内容的提问来源于stack exchange,提问作者lokanath das

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.04 08:36:25