[英]How to read stream without writing to disk?
我使用ReportViewer
创建了一个报告,可以在local machine
毫无问题地生成报告。 另一方面,我遇到错误“拒绝访问路径'C:\\ xxxxxxx.xlsx'”。 将应用程序发布到IIS
。 当然,这是由permission problem
引起的,但是在我们公司中,大多数情况下,对C驱动器的任何位置都没有写权限,我认为最好的方法是在内存等中打开生成的excel文件(不写)。到磁盘)。 因此,如何更新我使用的方法来实现此目的? 任何想法?
我将报告(使用ReportViewer
创建的报告)作为Stream
发送到此方法,并打开生成的报告而不写入磁盘:
public static void StreamToProcess(Stream readStream, string fileName, string fileExtension)
{
var myFile = fileName + "_" + Path.GetRandomFileName();
var writeStream = new FileStream(String.Format("{0}\\{1}.{2}",
Environment.GetFolderPath(Environment.SpecialFolder.InternetCache), myFile,
fileExtension), FileMode.Create, FileAccess.Write);
const int length = 16384;
var buffer = new Byte[length];
var bytesRead = readStream.Read(buffer, 0, length);
while (bytesRead > 0)
{
writeStream.Write(buffer, 0, bytesRead);
bytesRead = readStream.Read(buffer, 0, length);
}
readStream.Close();
writeStream.Close();
Process.Start(Environment.GetFolderPath(Environment.SpecialFolder.
InternetCache) + "\\" + myFile + "." + fileExtension);
}
任何帮助,将不胜感激。
更新:
我将报告流传递给此方法,如下所示:
StreamToProcess(reportStream, "Weekly_Report", "xlsx");
注意: reportStream
是使用ReportViewer
生成的报告。
您可以改为写入MemoryStream
然后将此流返回给调用方。 确保不关闭内存流实例。 然后,如果要处理内存文件,则可以将此内存流传StreamWriter
实例。
public static Stream StreamToProcess(Stream readStream)
{
var myFile = fileName + "_" + Path.GetRandomFileName();
var writeStream = new MemoryStream();
const int length = 16384;
var buffer = new Byte[length];
var bytesRead = readStream.Read(buffer, 0, length);
while (bytesRead > 0)
{
writeStream.Write(buffer, 0, bytesRead);
bytesRead = readStream.Read(buffer, 0, length);
}
readStream.Close();
return writeStream;
}
您当前调用Process.Start
方法在IIS服务器上不起作用,因为它将在服务器而不是用户计算机上打开Excel文档。 您将必须提供一个指向用户的链接来下载文件,您可以为此使用AJAX请求,该请求从MemoryStream流传输。 看看这篇文章 ,了解有关如何实现此功能的更多详细信息。
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.