ABCpdf - Скачать PDF с .NET Core 2.1 - HttpContext / HttpResponse - PullRequest
0 голосов
/ 09 ноября 2018

Я создаю веб-страницу, которая позволит пользователю загружать отчет в формате PDF с использованием ABCpdf.Но, читая документацию, я вижу только варианты doc.Save("test.pdf") (который сохраняет файл на сервере, на котором размещено приложение) или 'HttpContext.Current.ApplicationInstance.CompleteRequest();' (который сохраняет на стороне клиента, что я и хочу, ноHttpContext.Current недоступен в .NET Core.

У меня есть бинтовое решение с doc.Save(), я бы сохранил файл на сервере, а затем отправил бы ссылку на представление, которое затем загрузит егос сервера. Потенциальный риск, о котором я могу подумать, это убедиться в том, что после очистки на сервере началась «очистка».

Существует ли альтернативный / .NET Core эквивалент для HttpContext.Current, а также HttpResponse?

Вот код, который я хотел бы заставить работать:

byte[] theData = doc.GetData();
Response.ClearHeaders();
Response.ClearContent();
Response.Expires = -1000;
Response.ContentType = "application/pdf";
Response.AddHeader("content-length", theData.Length.ToString());
Response.AddHeader("content-disposition", "attachment; filename=test.pdf"); 
Response.BinaryWrite(theData);
HttpContext.Current.ApplicationInstance.CompleteRequest();

Ошибки, которые я получаю (не многословно)

'HttpResponse' does not contain a definition for 'ClearHeaders'
'HttpResponse' does not contain a definition for 'ClearContent'
'HttpResponse' does not contain a definition for 'Expires'
'HttpResponse' does not contain a definition for 'AddHeader'
'HttpResponse' does not contain a definition for 'BinaryWrite'
'HttpContext' does not contain a definition for 'Current'

1 Ответ

0 голосов
/ 12 ноября 2018

Я обновил этот ответ до чего-то, что действительно работает! GetStream делает то, что вам нужно, однако для облегчения загрузки файлов в .NET Core было бы намного проще, если бы вы создали контроллер, как описано в https://docs.microsoft.com/en-us/aspnet/core/tutorials/first-web-api?view=aspnetcore-2.1. Затем вы можете создать контроллер маршрута для обслуживания файла из потока, как показано в . Вернуть PDF в браузер, используя ядро ​​Asp.net . Таким образом, ваш контроллер будет выглядеть примерно так:

[Route("api/[controller]")]
public class PDFController : Controller {
// GET: api/<controller>
    [HttpGet]
    public IActionResult Get() {
        using (Doc theDoc = new Doc()) {
            theDoc.FontSize = 96;
            theDoc.AddText("Hello World");
            Response.Headers.Clear();
            Response.Headers.Add("content-disposition", "attachment; filename=test.pdf");
            return new FileStreamResult(theDoc.GetStream(), "application/pdf");
        }
    }
}

Из любопытства я только что смоделировал это, и оно работает - подача PDF непосредственно в браузер в качестве загрузки, когда вы переходите по URL-адресу localhost: port / api / pdf . Если вы сделаете расположение содержимого "встроенным; filename = test.pdf", оно будет отображаться в браузере и будет доступно для загрузки как test.pdf.

Более подробная информация о методе GetStream здесь: https://www.websupergoo.com/helppdfnet/default.htm?page=source%2F5-abcpdf%2Fdoc%2F1-methods%2Fgetstream.htm

...