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