Кажется, что эта строка не работает:
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 для скачивания файла)