MVC 5 Controller возвращает PDF файл не работает - PullRequest
0 голосов
/ 26 апреля 2018

Я пытаюсь создать файл PDF для моего проекта.

Вот мой код

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult PrintPdf(SubmitReport model)
    {
        if (model == null)
        {
            throw new ArgumentNullException(nameof(SubmitReport));
        }

        var pdfModel = new PdfViewModel {HeaderImgUrl = AppDomain.CurrentDomain.BaseDirectory + @"Content\logo.jpg"};
        var pdfStream = new MemoryStream(PdfGenerator.PayrollConfirmPdf(pdfModel).ToArray());

        // TODO: what is the name of the pdf file?
        var filename = string.Concat("PayrollConfirmation", DateTime.Now.ToString("yyyyMMddHHmmss"), ".pdf");

        return File(pdfStream, "application/pdf", filename);            
    }

Кажется, все работает нормально, но после возврата функции ничего не происходит.Я ожидал открыть / скачать файл PDF на моем локальном компьютере.Однако всплывающее окно не появляется (как будто ничего не происходит).

Есть идеи?

Заранее спасибо.

1 Ответ

0 голосов
/ 26 апреля 2018

Кажется, что эта строка не работает:

var pdfStream = new MemoryStream(PdfGenerator.PayrollConfirmPdf(pdfModel).ToArray());

Это создает экземпляр MemoryStream из байтового массива, который, возможно, FileResult начинает чтение с конца потока, а не с начала.

Вы можете использовать одно из 2 возможных решений ниже:

1) Преобразовать метод MemoryStream из PayrollConfirmPdf в байтовый массив и вернуть PDF как FileContentResult:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult PrintPdf(SubmitReport model)
{
    // other stuff

    byte[] pdfStream;

    using (var stream = new MemoryStream())
    {
        // fill stream content from other source
        stream = PdfGenerator.PayrollConfirmPdf(pdfModel);
        pdfStream = stream.ToArray();
    }

    // TODO: what is the name of the pdf file?
    var filename = string.Concat("PayrollConfirmation", DateTime.Now.ToString("yyyyMMddHHmmss"), ".pdf");

    // FileContentResult
    return File(pdfStream, "application/pdf", filename);            
}

2) Вернуть FileStreamResult с методом Seek, установленным в начало потока:

using (var stream = new MemoryStream())
{
    // fill stream content from other source
    // make sure that PayrollConfirmPdf return MemoryStream here!
    stream = PdfGenerator.PayrollConfirmPdf(pdfModel);

    // add this line when using memory stream
    // alternative 1: stream.Seek(0, 0);
    stream.Seek(0, SeekOrigin.Begin); 

    var filename = string.Concat("PayrollConfirmation", DateTime.Now.ToString("yyyyMMddHHmmss"), ".pdf");

    // FileStreamResult
    return File(stream, "application/pdf", filename);
}   

Обратите внимание, что вы можете использовать stream.Position = 0; для сброса позиции потока, если метод stream.Seek не работает.

Примечание:

Поскольку MemoryStream реализует IDisposable, вы должны использовать оператор using для немедленного удаления потока.

Подобные проблемы:

FileResult с MemoryStream дает пустой результат .. в чем проблема?

Возвращаемый файл для сохранения из метода HttpPost Asp.Net MVC (при использованииAJAX POST для скачивания файла)

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