如何使用 Blazor 呈现知道其内容类型的字节数组?

Posted

技术标签:

【中文标题】如何使用 Blazor 呈现知道其内容类型的字节数组?【英文标题】:How to render byte array knowing its content-type using Blazor? 【发布时间】:2020-08-03 07:26:09 【问题描述】:

以下代码对应于 Blazor 服务器端页面:

@page "/ShowFile/Id:guid" //// 放在这里让浏览器渲染存储在 this.Model 上的字节数组 //// 还有如何指定响应的内容类型? @代码 [范围] 公共指导 ID 获取;放; 私有字节 [] 模型 获取;放; 受保护的覆盖异步任务 OnInitializedAsync() 等待 base.OnInitializedAsync(); //// 根据标识符获取文件的字节数组。 this.Model = 等待 this.GetFile(this.Id).ConfigureAwait(false);

在 ASP.NET MVC 中,我曾经在控制器操作中这样做:

this.Response.ContentType = "应用程序/pdf"; //// 假设字节数组代表一个PDF文档。 等待 this.Response.Body.WriteAsync(this.Model);

如何让浏览器根据其内容类型在我的页面中呈现字节数组?

【问题讨论】:

您找到有效的解决方案了吗? @zsolt-bendes 回答有所帮助,但我将应用程序中的方法更改为不使用它。 是的,我得到了如下所示的工作,但我只想将 PDF 字节数组刷新到浏览器中的新文档下载中。 【参考方案1】:
@page "/test"
@inject HttpClient Http

@if (!string.IsNullOrEmpty(pdfContent))

    <embed src="@pdfContent"   />
    <iframe src="@pdfContent"   />
    <object data="@pdfContent"  ></object>



@code 
    string pdfContent = "";

    protected async override Task OnInitializedAsync()
    
        var data = await Http.GetByteArrayAsync("the source you pdf");

        pdfContent = "data:application/pdf;base64,";
        pdfContent += System.Convert.ToBase64String(data);
    


我在客户端 blazor 上试过这个,它在那里工作。在服务器端试一试。

【讨论】:

是的,该代码写入了数组的所有字节,但这并不意味着它将呈现该数组所代表的文档。我的意思是,该字节数组是一个序列化的 PDF 文档。浏览器应使用正确的响应内容类型呈现 PDF。 我现在更好地理解了这个问题。以前从未尝试过。你试过&lt;embed src="file_name.pdf" width="800px" height="2100px" /&gt; 吗? 我无法尝试,因为我没有PDF文档,我有的是它的字节数组序列化。 Http.GetByteArrayAsync 得到一个字节数组。来源应该无关紧要。【参考方案2】:

我设法通过Zsolt Bendes' 回答在服务器端 Blazor 上工作。获得 Base64 字符串后,我必须使用 StateHasChanged() 重新渲染页面。

@page "/Document/Open/documentId:int"

@if (!string.IsNullOrEmpty(pdfContent))

    <embed src="@pdfContent"   />
    <iframe src="@pdfContent"   />
    <object data="@pdfContent"  ></object>



@code 
    [Parameter]
    public int DocumentId  get; set; 
    string pdfContent = "";

    protected override async Task OnAfterRenderAsync(bool firstRender)
    
        if (firstRender)
        
            var apiService = await CreateClient();
            var data = await apiService.Open(DocumentId);
            pdfContent = "data:application/pdf;base64,";
            pdfContent += System.Convert.ToBase64String(data);
            StateHasChanged();

        
    

第一次呈现页面时,我创建了一个服务实例,该实例在其构造函数中采用 HTTP 客户端。然后我调用 Open 方法,它从 Azure Blob 存储返回字节数组。

【讨论】:

如果您在页面上使用任何 JS 互操作命令,这应该可以工作。

以上是关于如何使用 Blazor 呈现知道其内容类型的字节数组?的主要内容,如果未能解决你的问题,请参考以下文章

Blazor Server 每次使用的连接数受浏览器限制

Blazor 中是不是有与 Html.Raw 等效的内容?

.NET 8新预览版本使用 Blazor 组件进行服务器端呈现

如何使用 Blazor 框架在前端浏览器中导入和导出 Excel

如何从 Blazor 中的另一个组件重新渲染一个组件?

如何在 Swift 中查看 Data 变量中的实际字节数