【问题标题】:How to implement a file download in ASP.NET AJAX如何在 ASP.NET AJAX 中实现文件下载
【发布时间】:2010-11-22 21:37:21
【问题描述】:

我想使用标准的 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();

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

【问题讨论】:

  • 我很好奇为什么您不只是构建一个指向您要提供给客户端的文件的 URL,并将其提供给浏览器以用于下载您的文件。 ?
  • 这是一个txt文件,通常会直接显示在浏览器中。如果内容类型设置为“application/octet-stream”,我猜浏览器会启动下载到磁盘。
  • 那么“txt”文件只是一个例子。并且不直接显示在浏览器中。有了这个响应,它总是可以下载的。

标签: asp.net-ajax download


【解决方案1】:

我能够通过调用一个 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;
    }
}

【讨论】:

  • 我最初尝试将网格 ID 作为事件目标传递,但 doPostBack 足够聪明,可以知道这是 ajax 面板中的控件,并改为使用 make 和 ajax 回发。
【解决方案2】:

嗯,我在 Encosia 上找到了很好的博客文章,其中描述了这个 ASP.NET AJAX 文件下载问题的解决方案。真的很好用。

http://encosia.com/2007/02/23/ajax-file-downloads-and-iframes/

【讨论】:

    【解决方案3】:

    您可以尝试为这项工作制作一个处理程序。如果您修改得好,它会更安全。 对于这项工作,您需要在您放置文件链接的页面中加密文件路径。

    <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中有很多加密技术

    在您的 Handler 页面中,您需要将文件路径解密为原始路径,以便您可以使用 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();
    

    祝你好运。

    【讨论】:

      【解决方案4】:

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

      你可以试试这个:

      有一个名为Download.aspx 的页面,其中包含您已有的传输代码。

      在您的原始页面中,您有一个调用下载页面的 javascript 调用,如下所示:

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

      【讨论】:

        猜你喜欢
        • 2010-09-07
        • 1970-01-01
        • 2011-03-06
        • 2013-03-08
        • 1970-01-01
        • 2015-08-22
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多