如何在不写入磁盘的情况下读取流?

时间:2015-12-26 11:59:37

标签: c# asp.net asp.net-mvc file report

我使用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生成的报告。

1 个答案:

答案 0 :(得分:2)

您可以写入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文档。您必须提供用户下载文件的链接,您可以使用从MemoryStream流式传输的AJAX请求。有关如何实现此问题的更多详细信息,请查看此post