C# 如何在不写入磁盘的情况下读取流?
我使用C# 如何在不写入磁盘的情况下读取流?,c#,asp.net,asp.net-mvc,file,report,C#,Asp.net,Asp.net Mvc,File,Report,我使用ReportViewer创建了一个报告,我可以在本地机器上生成它,而且没有任何问题。另一方面,在将应用程序发布到IIS后,我遇到一个错误“对路径'C:\xxxxxxx.xlsx'的访问被拒绝。”。当然这是由权限问题引起的,但在我们公司,在大多数情况下,C驱动器的任何位置都没有写入权限,我认为最好的方法是在内存中打开生成的excel文件等(不写入磁盘)。那么,如何更新我使用的方法来实现这一点呢?有什么想法吗 我将报告(使用ReportViewer创建)作为Stream发送到此方法,并在不写入
ReportViewer
创建了一个报告,我可以在本地机器上生成它,而且没有任何问题。另一方面,在将应用程序发布到IIS
后,我遇到一个错误“对路径'C:\xxxxxxx.xlsx'的访问被拒绝。”。当然这是由权限问题引起的
,但在我们公司,在大多数情况下,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流式传输。有关如何实现此功能的更多详细信息,请查看此信息。非常感谢您的回复,但我无法将此流传递给StreamWriter
实例。我还添加了一个更新。通过查看此更新,您能否更新您的答案,说明如何获取此流?我扩展了我的答案,今晚稍后将尝试添加一个示例。非常感谢您的帮助。我用这种方法解决了这个问题。您的回复也很有用,我相信您可以将文件写入应用程序的根文件夹中。你可以进入那里。如果您担心文件被塞满,您可以在下载后立即删除它们,或者让一个进程对您进行批处理。您需要授予应用程序池使用的IIS\u用户
,对要写入的文件夹授予写入权限。因为您使用的是Process.Start
您不能使用MemoryStream。@Jaco为什么要删除您的好答案?我不必使用流程。如果我没有流程就解决了问题,那么就开始吧。你可以发布并编辑它,以便我可以打开你的方法返回的流吗?谢谢…人们经常使用“应用程序数据”文件夹来实现这些目的。您可以像这样获取其相对路径:string path=HttpContext.Current.Server.MapPath(“~/App\u Data/”);应用程序数据在您的VS解决方案中,请务必。通常发生的情况是,如果文件夹为空,则在生成生成/发布时,文件夹不会进入生成的包中。若要修复此问题,请在Visual Studio中的应用程序数据中添加一个dumb.txt文件,然后再次发布。文件夹将在那里。还要确保将.txt文件生成操作设置为Content