在服务器部署成功后 大多数情况下报表可以正常访问,打开。
但是有些少数情况下会提示:“ 文件以损坏 不能打开(大体是这个意思)” 。
是同一个画面为什么有的就能打开 有的就提示已经损坏了呢??(在服务器端可以正常生成报表文件但是发送到客户端就损坏)
请各位高人帮忙 万分感谢!!!
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);
同一个报表文件多数情况下是可以正常打开的 只有少数情况下提示文件损坏不能打开 这是怎么回事啊
而且在其他的服务器上都是好用的 (我自己怀疑是不是服务器配置的问题 但是具体是哪里配置的问题也不知道)请泰哥指教
( 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
泰哥,VS2003中 myReport 没有ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, false, "")这个方法
我也没找到类似的 应该怎么写啊
#7
VS2003里的版本我没怎么用过,
如果本身确实是没有流输出。你可以考虑不要即时File.Delete(OutputFilePath);
而是定期做一下清理。
比如命名规则:YYYYMMDD-HH-随机数.pdf
然后定期清理一下当前时间-2小时的文件,呵呵。
如果本身确实是没有流输出。你可以考虑不要即时File.Delete(OutputFilePath);
而是定期做一下清理。
比如命名规则:YYYYMMDD-HH-随机数.pdf
然后定期清理一下当前时间-2小时的文件,呵呵。
#8
嗯,我也觉得楼主可以这样做,出现文件到客户端就打不开,可能就是你的文件下载到客户端的文件并不完整。
你看下面的方法可以用么?
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文件 同一个报表访问的时候偶尔还是提示文件损坏不能打开(多数情况是可以打开的)
而且在其他的服务器上都是好用的 (是不是服务器哪里配置的问题)请泰哥和各位高人指教
这个问题太棘手了 请大家帮帮忙啊
为我不删除服务器端的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);
同一个报表文件多数情况下是可以正常打开的 只有少数情况下提示文件损坏不能打开 这是怎么回事啊
而且在其他的服务器上都是好用的 (我自己怀疑是不是服务器配置的问题 但是具体是哪里配置的问题也不知道)请泰哥指教
( 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
泰哥,VS2003中 myReport 没有ExportToHttpResponse(ExportFormatType.PortableDocFormat, Response, false, "")这个方法
我也没找到类似的 应该怎么写啊
#7
VS2003里的版本我没怎么用过,
如果本身确实是没有流输出。你可以考虑不要即时File.Delete(OutputFilePath);
而是定期做一下清理。
比如命名规则:YYYYMMDD-HH-随机数.pdf
然后定期清理一下当前时间-2小时的文件,呵呵。
如果本身确实是没有流输出。你可以考虑不要即时File.Delete(OutputFilePath);
而是定期做一下清理。
比如命名规则:YYYYMMDD-HH-随机数.pdf
然后定期清理一下当前时间-2小时的文件,呵呵。
#8
嗯,我也觉得楼主可以这样做,出现文件到客户端就打不开,可能就是你的文件下载到客户端的文件并不完整。
你看下面的方法可以用么?
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文件 同一个报表访问的时候偶尔还是提示文件损坏不能打开(多数情况是可以打开的)
而且在其他的服务器上都是好用的 (是不是服务器哪里配置的问题)请泰哥和各位高人指教
这个问题太棘手了 请大家帮帮忙啊
为我不删除服务器端的PDF文件 同一个报表访问的时候偶尔还是提示文件损坏不能打开(多数情况是可以打开的)
而且在其他的服务器上都是好用的 (是不是服务器哪里配置的问题)请泰哥和各位高人指教
这个问题太棘手了 请大家帮帮忙啊
#10
而且在其他的服务器上都是好用的 ????