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