我正在构建一个动态创建 PowerPoint 演示文稿的 ASP.NET Web 应用程序。我有基本的工作,但它会在硬盘上创建实际的物理文件。对于大型多用户 Web 应用程序来说,这似乎不是一个好主意。如果应用程序在内存中创建演示文稿,然后将它们流式传输回用户,似乎会更好。我应该使用 MemoryStream 类而不是操作文件吗?我不确定我是否理解使用文件和使用流之间的区别。它们可以互换吗?谁能指出我在内存而不是磁盘上进行文件类型操作的好资源?我希望我已经很好地描述了这一点。
科里
我正在构建一个动态创建 PowerPoint 演示文稿的 ASP.NET Web 应用程序。我有基本的工作,但它会在硬盘上创建实际的物理文件。对于大型多用户 Web 应用程序来说,这似乎不是一个好主意。如果应用程序在内存中创建演示文稿,然后将它们流式传输回用户,似乎会更好。我应该使用 MemoryStream 类而不是操作文件吗?我不确定我是否理解使用文件和使用流之间的区别。它们可以互换吗?谁能指出我在内存而不是磁盘上进行文件类型操作的好资源?我希望我已经很好地描述了这一点。
科里
您正在尝试根据“似乎不是一个好主意”的测量来做出您认为会影响应用程序性能的决定,这几乎不科学。最好同时实现两者并进行比较,但首先您应该列出您对任一实现的担忧。
以下是一些开始的想法:
文件和流是相似的,是的。两者本质上都是流式传输byte
数组……一个来自内存,一个来自硬盘。如果您使用的 API 允许您生成流,那么您可以轻松地执行此操作并将其提供给使用该Response
对象的用户。
以下代码将获取一个 PowerPoint 内存对象(您需要针对自己的 API 对其进行修改,但您可以了解大致的想法),将其保存到 a MemoryStream
,然后设置正确的标头并将流写入 Response(其中然后让用户将文件保存到他们的本地计算机):
SaveFormat format = SaveFormat.PowerPoint2007;
Slideshow show = PowerPointWriter.Generate(report, format);
MemoryStream ms = new MemoryStream();
show.Save(ms, format);
Response.Clear();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-powerpoint";
Response.AddHeader("Content-Disposition", "attachment; filename=\"Slideshow.ppt\"");
Response.BinaryWrite(ms.ToArray());
Response.End();
是的,我会推荐 MemoryStream。通常,每当您访问文件时,您都是在使用流进行访问。流有很多种(例如网络流、文件流和内存流),它们都实现了相同的基本接口。如果您已经在文件流中创建文件,而不是像字符串或字节数组这样的东西,那么它应该只需要很少的编码更改即可切换到 MemoryStream。
基本上,蒸汽只是一种处理大量数据的方式,您不必或不能一次将所有数据加载到内存中。因此,与其将整个数据集读取或写入到一个巨大的数组或其他东西中,不如打开一个流,它为您提供相当于游标的流。您可以将当前位置移动到流中的任何位置,并从该位置读取或写入。