如何从字节数组 c# MVC .NET Core 在 iframe 中显示 pdf
Posted
技术标签:
【中文标题】如何从字节数组 c# MVC .NET Core 在 iframe 中显示 pdf【英文标题】:How to display pdf in a iframe from a byte array c# MVC .NET Core 【发布时间】:2019-05-07 23:49:21 【问题描述】:我在网上搜索了答案,但没有任何运气。我想知道如何以及是否能够使用 Razor 将 pdf 文件渲染到位于我视图中的 iFrame 中。 pdf 是一个字节数组,并加载到我的模型中。
这是我目前的代码:
public ActionResult ByteConverter(byte[] pdfData)
MemoryStream Stream = new MemoryStream(pdfData);
Stream.Write(pdfData, 0 , pdfData.Length);
Stream.Position = 0;
return new FileStreamResult(Stream,"application/pdf");
我的模特:
public async Task<ActionResult> Index()
ApiClient api = new ApiClient("http://localhost:43674/ApiCore");
var result = await api.GetAsync();
RegulationViewModel viewModel = new RegulationViewModel
ConnectedToRoadMap = result.ConnectedToRoadMap,
Decided = result.Decided,
Enforced = result.Enforced,
Id = result.Id,
Paragraph = result.Paragraph,
Pdf = result.Pdf,
Published = result.Published,
Region = result.Region,
StructuredInfo = result.StructuredInfo,
Title = result.Title,
ValidThru = result.ValidThru
;
ByteConverter(viewModel.Pdf);
return View(viewModel);
我的看法:
<div class="tab-pane active" id="dokument">
<iframe src="@Url.Action("ByteConverter", "RegulationController")"></iframe>
</div>
【问题讨论】:
iframe 为空。正文或标题中没有内容。 我看到您正在将byte[]
传递到您的操作中 - 该值在哪里填充?
字节 [] 填充在我们正在构建的单独 API 中,该 API 从数据库中获取值。 API 获取数据并将其发送到我们的 WebbApp。所以基本上我得到了我需要的所有数据,我只需要在视图中呈现数据。这个特定的参数(pdfData)从模型中获取数据。
在您的问题中,您的 iframe
似乎是从一个不包含 pdfData
值的 URL 加载的,所以我不希望它按原样工作。 ByteConverter
方法是您调用 from 动作的动作还是辅助函数?顺便说一句,您不需要调用Stream.Write
,因为您正在使用的MemoryStream
构造函数已经设置了该数据(我认为在这种情况下您也不需要以下行)。跨度>
从模型中调用 ByteConverter 方法,我将编辑我的帖子并包含模型,以便您查看它的外观。
【参考方案1】:
好的,所以几天后,我设法通过将模型中的 Pdf 值更改为 Convert.ToBase64String(result.Pdf) 来使其工作,如下所示:
public async Task<ActionResult> Index()
ApiClient api = new ApiClient("http://localhost:43674/ApiCore");
var result = await api.GetAsync();
RegulationViewModel viewModel = new RegulationViewModel
ConnectedToRoadMap = result.ConnectedToRoadMap,
Decided = result.Decided,
Enforced = result.Enforced,
Id = result.Id,
Paragraph = result.Paragraph,
Pdf = Convert.ToBase64String(result.Pdf),
Published = result.Published,
Region = result.Region,
StructuredInfo = result.StructuredInfo,
Title = result.Title,
ValidThru = result.ValidThru
;
return View(viewModel);
在我看来,我完全跳过了 @Url.Action("ByteConverter", "RegulationController") 并将其替换为:
<iframe src="data:application/pdf;base64,@Model.Pdf" type="application/pdf"></iframe>
在除 IE 之外的所有网络浏览器中都像 i charm 一样工作,这是因为 Internet Explorer 不支持使用 DATA URI 作为 iframe 的来源。
【讨论】:
我正在尝试相同的方法,但调试器显示 - “资源解释为文档,但使用 MIME 类型 application/pdf 传输:“data:application/pdf;base64,JVBERi0xLjcKCjQgMCB...” 这是我的数据 - viewModel.PdfDataString = Convert.ToBase64String(pdfData); AND 在视图中 - 【参考方案2】:你可以像这样修改你的代码:
public ActionResult ByteConverter()
ApiClient api = new ApiClient("http://localhost:43674/ApiCore");
var result = await api.GetAsync();
var pdfData = result.Pdf;
MemoryStream Stream = new MemoryStream(pdfData);
Stream.Write(pdfData, 0 , pdfData.Length);
Stream.Position = 0;
return new FileStreamResult(Stream,"application/pdf");
在视图中:
<div class="tab-pane active" id="dokument">
<iframe src="@Url.Action("ByteConverter", "RegulationController")"></iframe>
</div>
然后在您的索引视图中删除ByteConverter(viewModel.Pdf);
。并确认您已设置正确的控制器名称,使用Home
而不是HomeController
。
【讨论】:
当我已经在我的模型中进行操作时,为什么还要在我的 ByteConverter 方法中创建一个新的 ApiClient 实例?感觉多余。此外,要使该代码不显示任何错误,您需要使 ByteConverter 方法异步,例如“public async Task ByteCONverter()”。 @K.Oleksiak 。问题是 ByteConverter 在 iframe 加载时没有获取字节值,您可以将result.Pdf
保存在服务器端,这取决于您。以上是关于如何从字节数组 c# MVC .NET Core 在 iframe 中显示 pdf的主要内容,如果未能解决你的问题,请参考以下文章
如何在 C# 中将数据发送到 ASP.NET Core MVC 控制器?
如何在 C# 页面 ASP.NET Core MVC 上使用 SignInManager 和 Usermanager
如何将两个数组作为 POST 请求参数从 AJAX 发送到 MVC 控制器(ASP .NET Core 3.1 剃须刀)?
如何确定在 C# ASP.NET CORE MVC 5.0 中选择了哪个单选按钮