Asp.Net Core: как сделать так, чтобы браузер показывал файл как загруженный перед его отправкой - PullRequest
0 голосов
/ 18 октября 2018

У меня есть следующее действие, которое генерирует файл:

public async Task<IActionResult> GetFile()
{
    //some long running action to actually generate the content 
    //(e.g. getting data from DB for reporting)
    await Task.Delay(10000); 

    return File(new byte[]{}, "application/octet-stream");
}

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

На самом деле я хочу, чтобы ASP.Net отправлял заголовки с именами файлов (чтобы браузер показывал пользователю, что файл начал загружаться) и откладывал отправку тела при создании содержимого файла.Можно ли это сделать?

Я попробовал следующее:

public async Task GetFile()
{
    HttpResponse response = this.HttpContext.Response;
    response.ContentType = "application/octet-stream";
    response.Headers["Content-Disposition"] = "inline; filename=\"Report.txt\"";

    //without writing the first 8 bytes 
    //Chrome doesn't display the file as being downloaded 
    //(or ASP.Net doesn't actually send the headers). 
    //The problem is, I don't know the first 8 bytes of the file :)            
    await response.WriteAsync(string.Concat(Enumerable.Repeat("1", 8)));

    await response.Body.FlushAsync();

    await Task.Delay(10000);
    await response.WriteAsync("1234567890");
}

Приведенный выше код работает, и я был бы счастлив, если бы мне не пришлось response.WriteAsync первые 8 байт для отправляемых заголовков.

Есть ли другие способы преодоления этого?

1 Ответ

0 голосов
/ 21 октября 2018

На самом деле, рассматриваемый код работает правильно.Проблема в том, что Chrome не показывает загружаемый файл до тех пор, пока не будет отправлено 8 байт

Однако, если вы хотите написать что-то подобное, подумайте о прочтении Стивена Клирипост несколько полезных абстракций.

...