VS2003水晶报表发布到服务器后访问时部分报表提示文件以损坏????在线等

时间:2021-07-31 09:09:11
我用的是 VS2003自带的水晶报表版本是9.1.5000.0 现在遇到个奇怪的问题:
在服务器部署成功后 大多数情况下报表可以正常访问,打开。
但是有些少数情况下会提示:“ 文件以损坏 不能打开(大体是这个意思)” 。
是同一个画面为什么有的就能打开 有的就提示已经损坏了呢??(在服务器端可以正常生成报表文件但是发送到客户端就损坏)
请各位高人帮忙 万分感谢!!!  

10 个解决方案

#1


在服务器端可以正常生成报表文件但是发送到客户端就损坏

这个是如何判断出来的呢?

#2


因为我的方法是:现在服务器端生成报表文件 然后发送到客户端 发送完毕后 就把服务器端的文件删掉
我测试的时候就把删除服务器端文件的代码注释了 然后发现在服务器端生成的报表是可以打开的

#3


代码如下:
( testRtp 就是已经绑定好数据的报表文件)
string temppath = DateTime.Now.ToString("yyyyMMdd") + DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second + ".pdf";
ExportOptions crExportOptions = new ExportOptions(); 
DiskFileDestinationOptions crDiskFileDestinationOptions = new DiskFileDestinationOptions(); 
crExportOptions =  testRtp.ExportOptions ;      
crExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat ;
crExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
string OutputFilePath = Server.MapPath(Request.ApplicationPath)+"\\"+temppath;
crDiskFileDestinationOptions.DiskFileName = OutputFilePath;
crExportOptions.DestinationOptions = crDiskFileDestinationOptions; 
testRtp.Export();
Response.Clear();    
Response.ClearContent(); 
Response.ClearHeaders (); 
Response.ContentType ="application/pdf"; 
Response.WriteFile(OutputFilePath); 
Response.Flush(); 
Response.Close();
File.Delete(OutputFilePath);

同一个报表文件多数情况下是可以正常打开的 只有少数情况下提示文件损坏不能打开 这是怎么回事啊 
而且在其他的服务器上都是好用的 (我自己怀疑是不是服务器配置的问题 但是具体是哪里配置的问题也不知道)请泰哥指教

#4


你的这个生成文件,是指导出成pdf或excel这类的导出文件吗?

如果是这样的话,可能是因为删除时机的问题,比如删除的动作比发送快,或者删除动作发生时该文件正在使用等。
可以考虑不生成物理文件,用流的形式,直接发送给客户端


//首先加载你的报表
...
 CrystalReportViewer1.ReportSource = myReport;
//下面的代码段直接将pdf写入到浏览器中的adodb reader
Response.Clear();
Response.ContentType = "application/pdf";
myReport.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, false, "");
Response.Flush();

#5


你删除后再重新生成一下看行不

#6


引用 4 楼 babyt 的回复:
你的这个生成文件,是指导出成pdf或excel这类的导出文件吗? 

如果是这样的话,可能是因为删除时机的问题,比如删除的动作比发送快,或者删除动作发生时该文件正在使用等。 
可以考虑不生成物理文件,用流的形式,直接发送给客户端 

如 

C# code//首先加载你的报表
...
 CrystalReportViewer1.ReportSource = myReport;
//下面的代码段直接将pdf写入到浏览器中的adodb reader
Response.Clear();
Response.Content…


泰哥,VS2003中 myReport 没有ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, false, "")这个方法 
我也没找到类似的 应该怎么写啊

#7


VS2003里的版本我没怎么用过,

如果本身确实是没有流输出。你可以考虑不要即时File.Delete(OutputFilePath); 

而是定期做一下清理。

比如命名规则:YYYYMMDD-HH-随机数.pdf

然后定期清理一下当前时间-2小时的文件,呵呵。

#8


引用 7 楼 babyt 的回复:
VS2003里的版本我没怎么用过, 

如果本身确实是没有流输出。你可以考虑不要即时File.Delete(OutputFilePath); 

而是定期做一下清理。 

比如命名规则:YYYYMMDD-HH-随机数.pdf 

然后定期清理一下当前时间-2小时的文件,呵呵。


嗯,我也觉得楼主可以这样做,出现文件到客户端就打不开,可能就是你的文件下载到客户端的文件并不完整。

你看下面的方法可以用么?

 MemoryStream oStream; 
 oStream = (MemoryStream)doc.ExportToStream(ExportFormatType.PortableDocFormat);
 HttpContext.Current.Response.Clear();
 HttpContext.Current.Response.Buffer = true;
 HttpContext.Current.Response.Charset = "utf-8";
 HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".PDF");
 HttpContext.Current.Response.ContentType = "application/pdf";
 HttpContext.Current.Response.BinaryWrite(oStream.ToArray());
 HttpContext.Current.Response.End();

#9


还是不好用啊 因不是删除服务器端文件的问题 
为我不删除服务器端的PDF文件 同一个报表访问的时候偶尔还是提示文件损坏不能打开(多数情况是可以打开的) 
而且在其他的服务器上都是好用的 (是不是服务器哪里配置的问题)请泰哥和各位高人指教
这个问题太棘手了 请大家帮帮忙啊

#10


而且在其他的服务器上都是好用的 ????

#1


在服务器端可以正常生成报表文件但是发送到客户端就损坏

这个是如何判断出来的呢?

#2


因为我的方法是:现在服务器端生成报表文件 然后发送到客户端 发送完毕后 就把服务器端的文件删掉
我测试的时候就把删除服务器端文件的代码注释了 然后发现在服务器端生成的报表是可以打开的

#3


代码如下:
( testRtp 就是已经绑定好数据的报表文件)
string temppath = DateTime.Now.ToString("yyyyMMdd") + DateTime.Now.Hour + DateTime.Now.Minute + DateTime.Now.Second + ".pdf";
ExportOptions crExportOptions = new ExportOptions(); 
DiskFileDestinationOptions crDiskFileDestinationOptions = new DiskFileDestinationOptions(); 
crExportOptions =  testRtp.ExportOptions ;      
crExportOptions.ExportFormatType = ExportFormatType.PortableDocFormat ;
crExportOptions.ExportDestinationType = ExportDestinationType.DiskFile;
string OutputFilePath = Server.MapPath(Request.ApplicationPath)+"\\"+temppath;
crDiskFileDestinationOptions.DiskFileName = OutputFilePath;
crExportOptions.DestinationOptions = crDiskFileDestinationOptions; 
testRtp.Export();
Response.Clear();    
Response.ClearContent(); 
Response.ClearHeaders (); 
Response.ContentType ="application/pdf"; 
Response.WriteFile(OutputFilePath); 
Response.Flush(); 
Response.Close();
File.Delete(OutputFilePath);

同一个报表文件多数情况下是可以正常打开的 只有少数情况下提示文件损坏不能打开 这是怎么回事啊 
而且在其他的服务器上都是好用的 (我自己怀疑是不是服务器配置的问题 但是具体是哪里配置的问题也不知道)请泰哥指教

#4


你的这个生成文件,是指导出成pdf或excel这类的导出文件吗?

如果是这样的话,可能是因为删除时机的问题,比如删除的动作比发送快,或者删除动作发生时该文件正在使用等。
可以考虑不生成物理文件,用流的形式,直接发送给客户端


//首先加载你的报表
...
 CrystalReportViewer1.ReportSource = myReport;
//下面的代码段直接将pdf写入到浏览器中的adodb reader
Response.Clear();
Response.ContentType = "application/pdf";
myReport.ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, false, "");
Response.Flush();

#5


你删除后再重新生成一下看行不

#6


引用 4 楼 babyt 的回复:
你的这个生成文件,是指导出成pdf或excel这类的导出文件吗? 

如果是这样的话,可能是因为删除时机的问题,比如删除的动作比发送快,或者删除动作发生时该文件正在使用等。 
可以考虑不生成物理文件,用流的形式,直接发送给客户端 

如 

C# code//首先加载你的报表
...
 CrystalReportViewer1.ReportSource = myReport;
//下面的代码段直接将pdf写入到浏览器中的adodb reader
Response.Clear();
Response.Content…


泰哥,VS2003中 myReport 没有ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, false, "")这个方法 
我也没找到类似的 应该怎么写啊

#7


VS2003里的版本我没怎么用过,

如果本身确实是没有流输出。你可以考虑不要即时File.Delete(OutputFilePath); 

而是定期做一下清理。

比如命名规则:YYYYMMDD-HH-随机数.pdf

然后定期清理一下当前时间-2小时的文件,呵呵。

#8


引用 7 楼 babyt 的回复:
VS2003里的版本我没怎么用过, 

如果本身确实是没有流输出。你可以考虑不要即时File.Delete(OutputFilePath); 

而是定期做一下清理。 

比如命名规则:YYYYMMDD-HH-随机数.pdf 

然后定期清理一下当前时间-2小时的文件,呵呵。


嗯,我也觉得楼主可以这样做,出现文件到客户端就打不开,可能就是你的文件下载到客户端的文件并不完整。

你看下面的方法可以用么?

 MemoryStream oStream; 
 oStream = (MemoryStream)doc.ExportToStream(ExportFormatType.PortableDocFormat);
 HttpContext.Current.Response.Clear();
 HttpContext.Current.Response.Buffer = true;
 HttpContext.Current.Response.Charset = "utf-8";
 HttpContext.Current.Response.AppendHeader("Content-Disposition", "attachment;filename=" + DateTime.Now.ToString("yyyyMMddHHmmss") + ".PDF");
 HttpContext.Current.Response.ContentType = "application/pdf";
 HttpContext.Current.Response.BinaryWrite(oStream.ToArray());
 HttpContext.Current.Response.End();

#9


还是不好用啊 因不是删除服务器端文件的问题 
为我不删除服务器端的PDF文件 同一个报表访问的时候偶尔还是提示文件损坏不能打开(多数情况是可以打开的) 
而且在其他的服务器上都是好用的 (是不是服务器哪里配置的问题)请泰哥和各位高人指教
这个问题太棘手了 请大家帮帮忙啊

#10


而且在其他的服务器上都是好用的 ????