我想使用标准的ASP.NET文件下载响应,例如in other Stack Overflow question。
Response.ContentType = "application/octet-stream";
Response.AppendHeader("Content-Disposition","attachment; filename=logfile.txt");
Response.TransmitFile( Server.MapPath("~/logfile.txt") );
Response.End();
但是在更新面板内部它不起作用。我必须做什么,如果在更新面板内触发了下载事件,我将获得一个文件?
答案 0 :(得分:10)
好吧,我在Encosia上找到了很好的博客文章,描述了这个ASP.NET AJAX文件下载问题的解决方案。它的工作非常好。
http://encosia.com/2007/02/23/ajax-file-downloads-and-iframes/
答案 1 :(得分:2)
您需要在不使用ajax的单独aspx中使用它。 Ajax正在更新客户端页面上的现有html标记。你在这里尝试的是在向客户端发送任何内容之前替换服务器端的响应内容。
你可以试试这个:
有一个名为Download.aspx
的网页,其中包含您已有的传输代码。
在原始页面中,您有一个调用下载页面的javascript调用,如下所示:
window.location.replace('Download.aspx');
答案 2 :(得分:0)
您可以尝试为此工作制作处理程序。如果您可以很好地修改它会更安全。 对于这项工作,您需要在页面中加密文件路径,在该页面中放置文件的链接。
<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
中有很多加密技术
在处理程序页面中,您需要将文件路径解密为原始路径,以便您可以使用System.IO
库进行阅读。
context.Response.ContentType = ""; //-->MimeType for your file's extension
您可以通过注册表指定MimeType,除非您的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();
祝你好运。
答案 3 :(得分:0)
我能够通过调用一个javascript函数来解决这个问题,该函数调用__doPostBack而没有__EVENTTARGET。
function GxGridView_Export(exportLink, exportType) {
var containingGrid = $(exportLink).closest("table .GxGridViewWithSlider");
__doPostBack('', containingGrid.attr('id') + "###" + exportType);
}
服务器端Grid然后解析__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;
}
}