2012-03-07 97 views
0

我已经阅读了一些过去的帖子,了解如何从网站下载Excel文件。因此,我已经设置了以下代码:下载Excel文件

string path = MapPath(fname); 
string name = Path.GetFileName(path); 
string ext = Path.GetExtension(path); 
string type = "application/vnd.ms-excel"; 


if (forceDownload) 
{ 
    Response.AppendHeader("content-disposition", 
     "attachment; filename=" + name); 
} 

if (type != "") 
{ 
    Response.ContentType = type; 
    Response.WriteFile(path); 
    Response.End(); 
} 

但是,我没有下载对话框。

我在IE 8和FireFox 10.0.2中都试过这个。
文件在那里,它没有被锁定,并且它没有被设置为只读。
我不确定是否出错了。

+0

该代码看起来不错。你用什么html元素下载文件?因为你不能使用ajax组件。 – 2012-03-07 14:24:17

+0

你的标准链接按钮 – Mike 2012-03-07 14:35:17

+0

Luiggi,你是对的我回去了,仔细检查和链接按钮是在一个Ajax容器,一旦我从那里删除它工作 – Mike 2012-03-07 15:15:25

回答

3

this link,你需要添加此line:

strFileName = Path.GetFileName(path); 
Response.TransmitFile(Server.MapPath(strFileName)); 

这将导致打开/另存为对话框以SailBig.jpg的文件名作为默认文件名预设弹出。

这当然假设你喂养一个已经存在的文件。如果您需要动态生成动态生成的内容 - 比如内存中生成的图像[或任何文件],则可以使用Response.BinaryWrite()来传输字节数组或直接在Response.OutputStream中写入输出。

编辑:

微软MSDN网站上有关于File Downloading详细的解释。它包括用于Java和.Net应用程序的两个示例,其概念是相同的:

  1. 获取响应。
  2. 答案:
    1. 将内容类型设置为“APPLICATION/OCTET-STREAM”(表示没有应用程序来打开文件)。
    2. 将标题设置为“Content-Disposition”,“attachment; filename = \”“+ +”\“”。
    3. 将文件内容写入响应中。
  3. 关闭响应。

因此,看MSDN的ASP.Net文件下载,你缺乏2.3步骤。你只是将文件名写入响应中。

// transfer the file byte-by-byte to the response object 
System.IO.FileInfo fileToDownload = new 
    System.IO.FileInfo("C:\\downloadJSP\\DownloadConv\\myFile.txt"); 
Response.Flush(); 
Response.WriteFile(fileToDownload.FullName); 

有了这个例子中,你会成功下载你的文件,当然如果你能得到没有问题:)文件。

编辑2:用来下载任何文件

HTML组件必须是一个普通的HTML请求。任何ajax请求下载文件将不起作用。微软解释说here。和主要报价:

它不可能通过JavaScript下载前后附加事件。浏览器出于安全原因不允许这种类型的事件。

+0

它被包裹在一个Ajax容器谢谢,并感谢大家的帮助.. – Mike 2012-03-07 15:16:41

+0

是的,我忘了提及,文件下载调用**不能从ajax调用**处理。 – 2012-03-07 15:22:31

+0

非常丰富 – sajad 2015-07-20 12:22:57

0

您需要的文件附件头之前发送此:

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

参见:Export data to excel file from Classic ASP failing

+0

但是不是使用ASP.Net的OP?您的链接指向用户使用ASP Classic的帖子。 – 2012-03-07 14:34:22

+0

技术是一样的。这都是关于标题。 – 2012-03-07 14:35:54

+0

好吧,我看着重做,所以Response.ContentType =“application/vnd.ms-excel”在AppendHeader之前,但仍然没有。 – Mike 2012-03-07 14:38:58

0

尝试增加这样的HTTP标头

Content-Type: application/force-download 
Content-Type: application/vnd.ms-excel 
Content-Type: application/download