Файл не загружается из файла или PhysicalFile IActionResult - PullRequest
0 голосов
/ 19 апреля 2019

Итак, у меня есть контроллер, который вызывает сервис. Служба загружает файл с FTP-сервера, и контроллер должен затем вернуть файл браузеру пользователя для загрузки файла, но этого не происходит. Код ниже:

[HttpGet]
[ValidateAntiForgeryToken]
public async Task<IActionResult> DownloadFileAsync(string file)
{
    // _ftpService.DownloadFileAsync(..) returns the downloaded files full physical path on the server: C:\Web\Images\file.jpg
    var downloadedFile = await _ftpService.DownloadFileAsync(file);

    // 1st attempt
    return PhysicalFile(downloadedFile, "image/jpeg", "file.jpg");

    // 2nd attempt
    using (var stream = new FileStream(downloadedFile, FileMode.Open))
    {
       return File(stream, "image/jpeg", "file.jpg");
    }

    // 3rd attempt
    byte[] fileBytes = System.IO.File.ReadAllBytes(downloadedFile);

    return File(fileBytes, "image/jpeg", "file.jpg");
}

Окно вывода в VS пишет:

Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action method DisplayStandManagerWeb.Controllers.DevicesController.DownloadFileAsync (DisplayStandManagerWeb), returned result Microsoft.AspNetCore.Mvc.FileContentResult in 6924.1833ms.
Microsoft.AspNetCore.Mvc.Infrastructure.FileContentResultExecutor:Information: Executing Microsoft.AspNetCore.Mvc.FileContentResult, sending file with download name 'file.jpg' ...
Microsoft.AspNetCore.Mvc.Internal.ControllerActionInvoker:Information: Executed action DisplayStandManagerWeb.Controllers.DevicesController.DownloadFileAsync (DisplayStandManagerWeb) in 6936.9755ms
Microsoft.AspNetCore.Routing.EndpointMiddleware:Information: Executed endpoint 'DisplayStandManagerWeb.Controllers.DevicesController.DownloadFileAsync (DisplayStandManagerWeb)'

Я на 100% уверен, что файл существует. С третьей попытки fileBytes даже заполняется байтами файла, но браузер не загружает файл.

Когда я нажимаю кнопку для загрузки, ничего не происходит, но я вижу загрузку файла на веб-сервер. Когда я устанавливаю точки останова, я также вижу, как он попадает в каждую строку возврата, но загрузка не начинается. Я не получаю ошибок или чего-то еще, поэтому очень трудно понять, что происходит.

1 Ответ

1 голос
/ 20 апреля 2019

Я так понимаю, вы запускаете этот запрос через AJAX. Однако вы не можете скачивать файлы через AJAX. Возвращенные данные файла становятся переменной JavaScript вместо файла на диске пользователя.

Если вам нужно запустить загрузку с помощью скрипта, используйте window.location.href или window.open, чтобы перейти по URL-адресу с помощью не-ajax-запроса. Или, конечно, вы можете использовать любой другой метод, например, ссылку для нажатия пользователем или форму для отправки

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...