繁体   English   中英

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

[英]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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM