把web服务器的xlsx文件下载到本地提示文件损坏

时间:2022-11-10 20:18:22
     我遇到一个问题,把web服务器的xlsx文件下载到本地,(在服务器是没问题的)打开提示文件损坏,web服务器也是我这台电脑,说简单点,就是通过下载,文件就损坏了,
文件错误提示提示:
<?xml version="1.0" encoding="UTF-8" standalone="yes"?>
<recoveryLog xmlns="http://schemas.openxmlformats.org/spreadsheetml/2006/main"><logFileName>error023160_01.xml</logFileName>
<summary>在文件“C:\Users\微软中国\Desktop\EccForcast-ECC_2017_9.xlsx”
中检测到错误</summary><additionalInfo><info>Excel 已完成文件级验证和修复。此工作簿的某些部分可能已被修复或丢弃。
</info></additionalInfo></recoveryLog>


以下是我下载处理代码:
    public static void DownLoadFile(string FilePath, string FileName)
        {
            try
            {
                //FilePath:服务器文件路径
                System.IO.FileStream fs = System.IO.File.OpenRead(FilePath);
                byte[] FileData = new byte[fs.Length];
                fs.Read(FileData, 0, (int)fs.Length);
                (HttpContext.Current.Handler as System.Web.UI.Page).Response.Clear();
                (HttpContext.Current.Handler as System.Web.UI.Page).Response.ClearHeaders();
                (HttpContext.Current.Handler as System.Web.UI.Page).Response.Buffer = true;
                FileName = System.Web.HttpUtility.UrlEncode(System.Text.Encoding.UTF8.GetBytes(FileName));
                (HttpContext.Current.Handler as System.Web.UI.Page).Response.ContentType = "application/octet-stream;charset=gbk";
                (HttpContext.Current.Handler as System.Web.UI.Page).Response.AddHeader("Content-Disposition", "inline;filename=" + System.Convert.ToChar(34) + FileName + System.Convert.ToChar(34));
                (HttpContext.Current.Handler as System.Web.UI.Page).Response.BinaryWrite(FileData);
                (HttpContext.Current.Handler as System.Web.UI.Page).Response.Flush();
                (HttpContext.Current.Handler as System.Web.UI.Page).Response.Clear();
                System.Web.HttpContext.Current.ApplicationInstance.CompleteRequest();
                fs.Close();
             //   System.IO.File.Delete(FilePath);



            }
            catch (Exception ex)
            {


            }
        }

17 个解决方案

#1


为何要指定charset=gbk,excel和gbk貌似没什么关系吧

#2


引用 1 楼 xdashewan 的回复:
为何要指定charset=gbk,excel和gbk貌似没什么关系吧

我试下其他的编码

#3


引用 1 楼 xdashewan 的回复:
为何要指定charset=gbk,excel和gbk貌似没什么关系吧

并不是编码错误引起的,所以的我都试过了

#4


引用 3 楼 weixin_38032820 的回复:
并不是编码错误引起的,所以的我都试过了

你可以参考下http://www.cnblogs.com/LoveQin/p/6846839.html

#5


把最后3行代码删掉。

另外,检查一下服务器端的 xlsx 文件是否能正常打开?有些所谓的“导出excel”功能产生的文件根本不是正规的 xlsx 文件,例如只不过是写了一个xml 文本,然后把文件名改为 .xlsx。那么这种文件在 Excel 打开时就会报警告。

#6


引用 5 楼 sp1234 的回复:
把最后3行代码删掉。

另外,检查一下服务器端的 xlsx 文件是否能正常打开?有些所谓的“导出excel”功能产生的文件根本不是正规的 xlsx 文件,例如只不过是写了一个xml 文本,然后把文件名改为 .xlsx。那么这种文件在 Excel 打开时就会报警告。


在服务器能正常打开,我有很多地方用到下载功能的,方法都一样,代码都一样的,就只有这个地方出问题,只是数据不一样

#7


引用 4 楼 xdashewan 的回复:
Quote: 引用 3 楼 weixin_38032820 的回复:

并不是编码错误引起的,所以的我都试过了

你可以参考下http://www.cnblogs.com/LoveQin/p/6846839.html

生成xlsx的方法没问题,生成xlsx后能打开,就是通过下载再打开就出问题了

#8


引用 7 楼 weixin_38032820 的回复:
生成xlsx的方法没问题,生成xlsx后能打开,就是通过下载再打开就出问题了

你要参考就是下载部分,生成excel那些代码和你无关

#9


各位说的方法我都试过了,不是这个原因

#10


对比一下下载到的文件和原始文件的文件大小。
文件不大的话直接io.file.readallbytes获取吧。二进制读的文件,编码不用关心。

#11


我打开xlsx文件提示如下图,是不是某些字符有问题?
把web服务器的xlsx文件下载到本地提示文件损坏

#12


下载方法不对

public FileContentResult downLoadFile()

       var file = File.OpenRead("filePath");
        return File(file.Content, "appliction/octet-stream", "you want file Name");//第二参数根据文件类型调整
 }

#13


引用 12 楼 foren_whb 的回复:
下载方法不对

public FileContentResult downLoadFile()

       var file = File.OpenRead("filePath");
        return File(file.Content, "appliction/octet-stream", "you want file Name");//第二参数根据文件类型调整
 }
试过了,并不是这个原因

#14


有没可能是因为某些字符不符规格,导致文件打不开的?

#15


对比一下原始文件和下载下来的文件的字节数。或者创建一个excel,只留一个sheet,在A1输入ABC,这样能得到一个最小体积的excel文件,直接断点DEBUG比对byte[],看是哪步的问题。

#16


引用 15 楼 Runnerchin 的回复:
对比一下原始文件和下载下来的文件的字节数。或者创建一个excel,只留一个sheet,在A1输入ABC,这样能得到一个最小体积的excel文件,直接断点DEBUG比对byte[],看是哪步的问题。

     读取字节是一样的,下载后,下载文件就比原始文件要大。    
       完全想不到是哪出问题了,如果是下载,或者生成xlsx的方法错误,应该很多地方都出错的,但是就一个地方下载出错误 把web服务器的xlsx文件下载到本地提示文件损坏

#17


下载时,数据写入时数据不完全,所以下载后打不开。使用一个较大的数组写入数据,把那个直接数组的长度写大一些。

#1


为何要指定charset=gbk,excel和gbk貌似没什么关系吧

#2


引用 1 楼 xdashewan 的回复:
为何要指定charset=gbk,excel和gbk貌似没什么关系吧

我试下其他的编码

#3


引用 1 楼 xdashewan 的回复:
为何要指定charset=gbk,excel和gbk貌似没什么关系吧

并不是编码错误引起的,所以的我都试过了

#4


引用 3 楼 weixin_38032820 的回复:
并不是编码错误引起的,所以的我都试过了

你可以参考下http://www.cnblogs.com/LoveQin/p/6846839.html

#5


把最后3行代码删掉。

另外,检查一下服务器端的 xlsx 文件是否能正常打开?有些所谓的“导出excel”功能产生的文件根本不是正规的 xlsx 文件,例如只不过是写了一个xml 文本,然后把文件名改为 .xlsx。那么这种文件在 Excel 打开时就会报警告。

#6


引用 5 楼 sp1234 的回复:
把最后3行代码删掉。

另外,检查一下服务器端的 xlsx 文件是否能正常打开?有些所谓的“导出excel”功能产生的文件根本不是正规的 xlsx 文件,例如只不过是写了一个xml 文本,然后把文件名改为 .xlsx。那么这种文件在 Excel 打开时就会报警告。


在服务器能正常打开,我有很多地方用到下载功能的,方法都一样,代码都一样的,就只有这个地方出问题,只是数据不一样

#7


引用 4 楼 xdashewan 的回复:
Quote: 引用 3 楼 weixin_38032820 的回复:

并不是编码错误引起的,所以的我都试过了

你可以参考下http://www.cnblogs.com/LoveQin/p/6846839.html

生成xlsx的方法没问题,生成xlsx后能打开,就是通过下载再打开就出问题了

#8


引用 7 楼 weixin_38032820 的回复:
生成xlsx的方法没问题,生成xlsx后能打开,就是通过下载再打开就出问题了

你要参考就是下载部分,生成excel那些代码和你无关

#9


各位说的方法我都试过了,不是这个原因

#10


对比一下下载到的文件和原始文件的文件大小。
文件不大的话直接io.file.readallbytes获取吧。二进制读的文件,编码不用关心。

#11


我打开xlsx文件提示如下图,是不是某些字符有问题?
把web服务器的xlsx文件下载到本地提示文件损坏

#12


下载方法不对

public FileContentResult downLoadFile()

       var file = File.OpenRead("filePath");
        return File(file.Content, "appliction/octet-stream", "you want file Name");//第二参数根据文件类型调整
 }

#13


引用 12 楼 foren_whb 的回复:
下载方法不对

public FileContentResult downLoadFile()

       var file = File.OpenRead("filePath");
        return File(file.Content, "appliction/octet-stream", "you want file Name");//第二参数根据文件类型调整
 }
试过了,并不是这个原因

#14


有没可能是因为某些字符不符规格,导致文件打不开的?

#15


对比一下原始文件和下载下来的文件的字节数。或者创建一个excel,只留一个sheet,在A1输入ABC,这样能得到一个最小体积的excel文件,直接断点DEBUG比对byte[],看是哪步的问题。

#16


引用 15 楼 Runnerchin 的回复:
对比一下原始文件和下载下来的文件的字节数。或者创建一个excel,只留一个sheet,在A1输入ABC,这样能得到一个最小体积的excel文件,直接断点DEBUG比对byte[],看是哪步的问题。

     读取字节是一样的,下载后,下载文件就比原始文件要大。    
       完全想不到是哪出问题了,如果是下载,或者生成xlsx的方法错误,应该很多地方都出错的,但是就一个地方下载出错误 把web服务器的xlsx文件下载到本地提示文件损坏

#17


下载时,数据写入时数据不完全,所以下载后打不开。使用一个较大的数组写入数据,把那个直接数组的长度写大一些。