【问题标题】:How to download memoryStream file如何下载memoryStream文件
【发布时间】:2012-11-20 13:02:57
【问题描述】:

我是 asp.net 的初学者,我使用 PdfRpt 创建 pdf 文件。我在课堂上写这段代码

namespace PdfReportSamples.CustomPriceNumber
{
    public class CustomPriceNumberPdfReport
    {
        public IPdfReportData CreatePdfReport()
        {
            using (var memoryStream = new MemoryStream())
            {
                var ii= new PdfReport().DocumentPreferences(doc =>
                {
                    doc.RunDirection(PdfRunDirection.LeftToRight);
                    doc.Orientation(PageOrientation.Portrait);
                    doc.PageSize(PdfPageSize.A4);
                    doc.DocumentMetadata(new DocumentMetadata { Author = "Vahid", Application = "PdfRpt", Keywords = "Test", Subject = "Test Rpt", Title = "Test" });
                })
           .DefaultFonts(fonts =>
           {
               fonts.Path(Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\arial.ttf",
                                 Environment.GetEnvironmentVariable("SystemRoot") + "\\fonts\\verdana.ttf");
           })
           .PagesFooter(footer =>
           {
               footer.DefaultFooter(DateTime.Now.ToString("MM/dd/yyyy"));
           })
           .PagesHeader(header =>
           {
               header.DefaultHeader(defaultHeader =>
               {
                   defaultHeader.RunDirection(PdfRunDirection.LeftToRight);

               });
           })
           .MainTableTemplate(template =>
           {
               template.BasicTemplate(BasicTemplate.SilverTemplate);
           })
           .MainTablePreferences(table =>
           {
               table.ColumnsWidthsType(TableColumnWidthType.Relative);
           })
           .MainTableDataSource(dataSource =>
           {
               var listOfRows = new List<Transaction>();
               for (int i = 0; i < 200; i++)
               {
                   listOfRows.Add(new Transaction
                   {
                       Product = "Item " + i,
                       Description = "Desc. " + i,
                       SalePrice = 1000 * i
                   });
               }
               dataSource.StronglyTypedList(listOfRows);
           })

           .MainTableColumns(columns =>
           {
               columns.AddColumn(column =>
               {
                   column.PropertyName("rowNo");
                   column.IsRowNumber(true);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.IsVisible(true);
                   column.Order(0);
                   column.Width(1);
                   column.HeaderCell("#");
               });

               columns.AddColumn(column =>
               {
                   column.PropertyName<Transaction>(x => x.Product);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.IsVisible(true);
                   column.Order(1);
                   column.Width(2);
                   column.HeaderCell("Product");
               });

               columns.AddColumn(column =>
               {
                   column.PropertyName<Transaction>(x => x.Description);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.IsVisible(true);
                   column.Order(2);
                   column.Width(3);
                   column.HeaderCell("Description");
               });

               columns.AddColumn(column =>
               {
                   column.PropertyName<Transaction>(x => x.SalePrice);
                   column.CellsHorizontalAlignment(HorizontalAlignment.Center);
                   column.IsVisible(true);
                   column.Order(3);
                   column.Width(3);
                   column.HeaderCell("Sale Price");
                   column.ColumnItemsTemplate(template =>
                   {
                       template.CustomTemplate(new CustomPriceCell());
                   });
                   column.AggregateFunction(aggregateFunction =>
                   {
                       aggregateFunction.NumericAggregateFunction(AggregateFunction.Sum);
                       aggregateFunction.DisplayFormatFormula(obj => obj == null ? string.Empty : string.Format("{0:n0}", obj));
                   });
               });

           })
           .MainTableEvents(events =>
           {
               events.DataSourceIsEmpty(message: "There is no data available to display.");
           })
           .Export(export =>
           {
               export.ToExcel();
           })
           .Generate(data => data.AsPdfStream(memoryStream));


       }


        }
    }
}

我希望当用户单击按钮时发送此文件(到 memoryStream )以供下载。但我不知道如何编写这段代码。请帮我。谢谢专家

【问题讨论】:

  • 真的不清楚“发送此文件(到 memoryStream 中)以供下载”是什么意思。您正在创建一个MemoryStream,但随后完全忽略它,因为您将立即从该方法返回。看起来创建报告的代码应该对其进行序列化 - 它应该只是将报告返回给调用代码,然后调用代码可以将其保存到流中。不幸的是,我们没有足够的上下文来提供更多帮助。
  • @Jon Skeet:首先我在 MemoryStream 中创建 pdf 文件,例如我将按钮放入表单中,当用户单击按钮时我想要下载此文件。
  • 对,正如我所建议的,您需要将“创建和返回报告”与“写入内存流”分开。您现在将它们放在一起的方式意味着内存流是在不想使用它的代码中创建的。

标签: c# asp.net


【解决方案1】:
byte[] bytes = memoryStream.GetBuffer();
Response.Buffer = true;
Response.Clear();
Response.ContentType = "application/pdf";
Response.AddHeader("content-disposition", "attachment; filename=report.pdf");
Response.BinaryWrite(bytes);
Response.Flush();

【讨论】:

  • 这会写得比它应该做的多——要么使用ToByteArray,要么根据内存流的长度限制BinaryWrite调用。
  • 请注意,文件名应使用Server.UrlEncode(filename)编码。
猜你喜欢
  • 2021-11-18
  • 2020-02-04
  • 1970-01-01
  • 2013-08-13
  • 1970-01-01
  • 2013-01-15
  • 2012-01-27
  • 2021-12-24
  • 2014-08-17
相关资源
最近更新 更多