Response.Transmitfile();能够节省但无法打开

时间:2012-03-20 15:43:35

标签: c# asp.net response.transmitfile

我正在尝试使用

发送xlsx文件
Response.Clear();
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.AddHeader("Content-Length", file.Length.ToString());
Response.ContentType = "application/vnd-ms.excel";
Response.TransmitFile(file.FullName);
Response.End();

弹出IE对话框,我可以成功保存文件,然后从文件夹中打开它,工作正常,花花公子。但如果我在IE对话框中单击“打开”,我会收到“无法下载myFile.xlsx”。我单击“重试”并打开Excel但弹出“Excel无法打开文件'myFile.xlsx',因为文件格式或文件扩展名无效...”错误。
我目前正在调试模式下从VS2010运行该站点。

有人知道为什么它会让我保存,但不能直接打开吗?

修改
Chrome只是下载它。 FF尝试打开它但是给出了错误The file you are trying to open, 'myFile.xlsx.xls', is in a different format than specified by the file extension...我可以选择打开它并且它成功打开,但是处于只读模式。
所以,这里有一些时髦的东西 fileName =“myFile.xlsx”

编辑2
这是在IE 9中。我还尝试了octet-streamapplication/vnd.openxmlformats-officedocument.spreadsheetml.sheet作为ContentType。

5 个答案:

答案 0 :(得分:5)

这是因为您的ContentType错误。使用

Response.ContentType = "application/vnd.ms-excel";

修改

如果它不起作用,你可以尝试

FileStream sourceFile = new FileStream(file.FullName, FileMode.Open);
float FileSize;
FileSize = sourceFile.Length;
byte[] getContent = new byte[(int)FileSize];
sourceFile.Read(getContent, 0, (int)sourceFile.Length);
sourceFile.Close();
Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Length", getContent.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.BinaryWrite(getContent);
Response.Flush();
Response.End();

答案 1 :(得分:2)

我曾经遇到过同样的问题,并通过修改应用服务器(在本例中为IIS)发送的缓存指令来解决。有时您会在应用程序级别添加标头,以防止在某些情况下保存文件,例如在HTTPS连接中。确保您没有提出相互矛盾的说明。

答案 2 :(得分:1)

我遇到了类似的问题。

原来我是从流的末尾读取的,所以字节数组没有充满任何东西。

在读取流之前将流位置设置为0(sourceFile.Position = 0;)(sourceFile.Read(getContent,0,(int)sourceFile.Length);)为我修复它。

看看是否有帮助。

至于“Response.ContentType”,“application / vnd.ms-excel”对我有用。

FileStream sourceFile = new FileStream(file.FullName, FileMode.Open);
float FileSize;
FileSize = sourceFile.Length;
byte[] getContent = new byte[(int)FileSize];
  

sourceFile.Position = 0;

sourceFile.Read(getContent, 0, (int)sourceFile.Length);
sourceFile.Close();
Response.ClearContent();
Response.ClearHeaders();
Response.Buffer = true;
Response.ContentType = "application/vnd.ms-excel";
Response.AddHeader("Content-Length", getContent.Length.ToString());
Response.AddHeader("Content-Disposition", "attachment; filename=" + fileName);
Response.BinaryWrite(getContent);
Response.Flush();
Response.End();

答案 3 :(得分:0)

巧合的是,我正好在类似的东西......

用于xlsx的MIME类型为application/vnd.openxmlformats-officedocument.spreadsheetml.sheet,请参阅this question

答案 4 :(得分:0)

我被这个问题困扰了,特别是文件较长。

在我们的案例中使用Content-Length标头修复了问题。一旦内容超过一定长度,就会出现这个问题。

示例(其中tempsbldr是StringBuilder):

  Response.AddHeader("Content-Length",tempsbldr.Length.ToString());