Загрузка файла возвращает только файл с [Object Object] в качестве содержимого - PullRequest
0 голосов
/ 29 января 2020

У меня есть поле выбора, где я предоставляю ссылки на скачивание всех 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, метод InvokeAsyn c страницы бритвы вызывает 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);
}

Проблема в том, что файлы, которые я получаю, содержат только следующее содержимое:

[объект объекта]

Когда я использую Почтальон, чтобы вызвать API с filepath в качестве параметра, я получаю правильный ответ с моим файлом PDF.

Пытаясь отладить эту ошибку, я узнал, что объект File в моем контроллере в порядке, а байт [] имеет тот же размер, что и мой файл.

Но когда я смотрю на Javascript, возникает проблема: fileContent дает мне statusCode 500, а значение link.href равно

"data: text / plain; charset = 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>;
...