2009-08-26 25 views
8

我想使用标准的ASP.NET文件下载响应,如in other Stack Overflow question如何在ASP.NET中实现文件下载AJAX

Response.ContentType = "application/octet-stream"; 
Response.AppendHeader("Content-Disposition","attachment; filename=logfile.txt"); 
Response.TransmitFile(Server.MapPath("~/logfile.txt")); 
Response.End(); 

但在里面的更新面板不起作用。我必须做什么,如果下载事件在更新面板内触发,我将获得一个文件?

+0

我很好奇你为什么不只是构建一个指向你想要提供给客户端的文件的URL,并将它提供给浏览器用来下载你的文件。 ? – 7wp 2009-08-26 07:08:13

+0

这是一个txt文件,通常会直接显示在浏览器中。如果内容类型设置为“application/octet-stream”,我猜浏览器会启动下载到磁盘。 – awe 2009-08-26 07:59:17

+0

那么“txt”文件就是一个例子。它不直接显示在浏览器中。有了这个响应,它总是可以下载的。 – 2009-08-27 10:26:02

回答

2

你需要在不使用ajax的单独aspx中有这个。 Ajax正在更新客户端页面上的现有html标记。您在此尝试的是在将任何内容发送到客户端之前替换服务器端上的响应内容。

你可以试试这个:

有一个名为Download.aspx页面包含您已经发送代码。

在原始网页,你有一个JavaScript调用,调用下载页面这样的:

window.location.replace('Download.aspx'); 
0

你可以尝试做一个处理这个work.It是更安全的,如果你可以修改好。 对于这项工作,您需要加密页面中为文件添加链接的文件路径。

<a href=\"Downloads.ashx?f={0}\" target=\"_blank\">Your link to file</a> 
//{0} -> Encrypted file path 
//target = _blank force browser to download file in another window 

有很多加密技术在here

在你处理器页面,您需要解密的文件路径为原来的一个,这样你可以用System.IO图书馆阅读。

context.Response.ContentType = ""; //-->MimeType for your file's extension 

您可以通过注册表,除非你的MIME类型是静态的如图像指定媒体类型。

string mimeType = Registry.GetValue(string.Format(@"HKEY_CLASSES_ROOT\.{0}", 
        Path.GetExtension(decryptedfilePath)), "Content Type", null).ToString(); 

//Then everything is ready for download 

byte[] buffer = File.ReadAllBytes(decryptedfilePath); 
context.Response.OutputStream.Write(buffer, 0 , buffer.Length); 
context.Response.Flush(); 

祝你好运。

0

我能够通过调用javascript函数,它没有__EVENTTARGET调用__doPostBack来解决这个问题。

function GxGridView_Export(exportLink, exportType) { 
    var containingGrid = $(exportLink).closest("table .GxGridViewWithSlider"); 
    __doPostBack('', containingGrid.attr('id') + "###" + exportType); 
} 

服务器端网格然后解析__EVENTARGUMENT并呈现导出文件。

var eventArg = Page.Request.Form["__EVENTARGUMENT"]; 
if (!string.IsNullOrEmpty(eventArg) && eventArg.Contains("###")) 
{ 
    var eventParams = eventArg.Split(new string[] { "###" }, StringSplitOptions.RemoveEmptyEntries); 
    if (eventParams.Length == 2 && eventParams[0] == this.ClientID) 
    { 
     ExportGrid(eventParams[1]); 
     return; 
    } 
} 
+0

我最初尝试传递网格ID作为事件目标,但doPostBack在某种程度上足够聪明,可以知道这是ajax面板中的控件,而使用make和ajax回发。 – 2013-10-24 18:24:27