【发布时间】:2021-12-01 00:59:11
【问题描述】:
我正在按照此视频中的说明进行操作:https://www.youtube.com/watch?v=7V0Yb5drLgQ
当链接直接放入我剃须刀的组件 html 部分时,一切正常:
RazorComponent
<a type="button" style="margin-left:20px;" class="btn btn-outline-secondary" href="https://localhost:5001/api/Report/GetReport?reportType=1">
<span class="oi oi-data-transfer-download"></span> @(l.Keys["CPVH_Download_PDF"])
</a>
</div>
下面是我的 API 的控制器逻辑
服务器接口
[HttpGet("[action]/{reportType}")]
public IActionResult GetReport(int reportType)
{
var dt = new DataTable();
dt = employeeService.GetEmployee();
string mimeType = "";
int extension = 1;
var path = $"{this._webHostEnvironment.WebRootPath}\\Reports\\Report1.rdlc";
Dictionary<string, string> parameters = new Dictionary<string, string>();
parameters.Add("param", "RDLC report in Blazor Web Assembly");
LocalReport localReport = new LocalReport(path);
localReport.AddDataSource("dsEmployee", dt);
//For Pdf
if (reportType == 1)
{
var result = localReport.Execute(RenderType.Pdf, extension, parameters, mimeType);
return File(result.MainStream, "application/pdf", "myPdf.pdf");
}
else //if (reportType == 1)
{
//For Excel
var result = localReport.Execute(RenderType.Excel, extension, parameters, mimeType);
return File(result.MainStream, "application/msexcel", "myReport.xls");
}
}
但是,当我将 razor 组件调用包装到调用 Get 或 Post 的服务中时,即使我仍然点击控制器,文件也不会下载。我只收到 Ok 响应,但没有发生文件下载。
服务调用 api
public async Task GetReport(int reportType)
{
var httpResponse = await _httpClient.GetAsync($"{_httpClient.BaseAddress.ToString()}/Report/GetReport/{reportType}");
var saveDir = Path.Combine(Path.GetTempPath(), "myPdf.pdf");
if (httpResponse.IsSuccessStatusCode)
{
var content = httpResponse.Content.ReadAsByteArrayAsync().Result;
File.WriteAllBytes(saveDir, content);
}
}
【问题讨论】:
-
不清楚代码试图做什么。 Razor 组件只包含一个链接。单击它会导航到它的 URL。没有什么可以包装的。仅因为控制器返回二进制文件而下载文件。您可以通过写
var bytes=await HttpClient.GetByteArrayAsync("https://localhost:5001/api/Report/GetReport?reportType=1")来执行相同的操作。如果指定 HttpClient 的基地址为https://localhost:5001/api/Report/GetReport?reportType=1,则可以使用HttpClient.GetByteArrayAsync("GetReport?reportType=1")。 -
Excel 或 PDF 文件不是文本,因此您不能使用
Content.ReadAsStringAsync阅读它们。您必须使用ReadAsByteArrayAsync或ReadAsStreamAsync -
你好@PanagiotisKanavos 谢谢你的帮助!我已经查看了您的 cmets,并在“服务调用对 api 的调用”部分下对我的代码进行了轻微更改。为了回答您的问题,我正在尝试调用 api 并获取报告字节并将它们保存到 blazor 客户端中的文件中。至于包装到您问题的服务部分,目前我将其保留为一个简单的服务,但最终将添加更多代码,包括模型参数,但目前我没有这样做。我仍然面临的问题是没有文件生成到光盘中......
-
如果我做 _httpClient.GetByteArrayAsync 我不能再使用 httpResponse.Content.ReadAsByteArrayAsync().Result 这只有在 GetAsync 因为 GetByteArrayAsync 结果没有内容属性时才有效。
-
浏览器还不允许客户端代码访问文件系统。 File System Access API 的早期版本仅适用于 Chrome 和 Edge v86 及更高版本。
标签: blazor rdlc reportviewer webassembly