c# - 文件下载只返回一个以[Object Object]为内容的文件
问题描述
我有一个选择框,我在其中提供用户目录中所有 PDF 文件的下载链接。通过单击一个选项,应触发下载:
剃须刀页面:
<td>
<select @onchange="@((e) => DownloadFile(e))">
<option disabled>Bitte wählen</option>
@foreach (string file in Directory.EnumerateFiles(
"\\\\my.server\\Application\\Data\\",
"*",
SearchOption.TopDirectoryOnly))
{
<option value="@file">@TrimFilePath(@file, Convert.ToString(@user.PkId))</option>
}
</select>
</td>
<td>
@code
{
public async void DownloadFile(ChangeEventArgs e)
{
string file = e.Value.ToString();
await JSRuntime.InvokeAsync<object>(
"FileSaveAs",
file.Split('\\').Last(),
await Http.GetAsync("api/UserManagement?FileName="+file)
);
}
}
DownloadFile 方法对我的控制器进行 Web API 调用:
namespace UserManagement.Controller
{
[Route("api/[controller]")]
[ApiController]
public class UserManagementController : ControllerBase
{
// Get: api/UserManagement
[HttpGet]
public IActionResult Get(string FileName)
{
byte[] fileBytes = System.IO.File.ReadAllBytes(FileName);
return File(fileBytes, System.Net.Mime.MediaTypeNames.Application.Pdf);
}
}
}
控制器返回 File 对象后,剃须刀页面的 InvokeAsync 方法调用 Javascript 启动下载:
Javascript:
function FileSaveAs(filename, fileContent) {
var link = document.createElement('a');
link.download = filename;
link.href = "data:text/plain;charset=utf-8," + encodeURIComponent(fileContent)
document.body.appendChild(link);
link.click();
document.body.removeChild(link);
}
问题是我得到的文件里面只有以下内容:
[对象对象]
当我使用 Postman 以文件路径作为参数调用 API 时,我的 PDF 文件得到了正确的响应。
尝试调试此错误时,我了解到我的控制器中的 File 对象可以正常使用 byte[] 与我的文件大小相同。
但是当我查看 Javascript 时,问题出在:fileContent 给了我一个 statusCode 500,而 link.href 的值是
“数据:文本/纯文本;字符集=utf-8,%5Bobject%20Object%5D”
我还尝试将<a>
元素绑定到选项,但这不起作用:
<select>
<option disabled>Bitte wählen</option>
@foreach (string file in Directory.EnumerateFiles(
"\\\\company.local\\Application\\Data\\" +
@user.PkId, "*", SearchOption.TopDirectoryOnly))
{
<option value="@file">
<a href="@file">@TrimFilePath(@file, Convert.ToString(@user.PkId))</a>
</option>
}
</select>;
解决方案
推荐阅读
- javascript - 脚本标签未同步呈现
- c# - 使用 VS2019 / .Net Core 3.1 的“生成单个文件”发布选项时,是否可以在部署后保持 appsettings.json 可编辑?
- javascript - fooplugins/Footable - 尝试从 JSON 加载表时“无法读取属性 'name' of null”
- c# - 如何使用 C# 在 WMI 中读取驱动程序属性扩展配置 ID
- python - 如何从键盘按下按钮而不是在 tkinter 中使用鼠标?
- javascript - JavaScript 丢失“this”上下文,类函数中的函数
- django - 我如何修改 django-tracking2 以便用户可以选择退出跟踪
- reactjs - Curl 有效,但 React App 在使用 Axios 和 Express 时抛出无法 POST / 错误
- javascript - 初始化函数 TypeError:无法读取 null 的属性“样式”
- javascript - 多个 Javascript 闭包和命名实践让我都转过身来