首页 > 解决方案 > 文件下载只返回一个以[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>;

标签: c#blazorblazor-server-side

解决方案


推荐阅读