【问题标题】:ASP.NET XMLHTTPREQUEST download file using HandlerASP.NET XMLHTTPREQUEST 使用 Handler 下载文件
【发布时间】:2011-11-09 17:15:07
【问题描述】:

我正在尝试使用 xmlhttprequest 实现文件下载...但没有得到文件对话框或任何响应。我已经调试处理程序,没有错误。

   function download(id)
    {
    try 
    {
        var xmlHttp=new XMLHttpRequest();
        xmlHttp.open("GET","DownloadFileHandler.ashx?id=" + id,false);       
        xmlHttp.send();
           xmlHttp.onreadystatechange=function()
    {
        //if request has been entertained and response is returned from server
        if(xmlHttp.readyState==4)
       {       
          alert("aq");

        }
    }
}



    catch (ex)
    {
    alert("Browser does not support ajax");
    }

    }
}

我的处理程序

context.Response.AppendHeader("content-disposition", "attachment; filename=" + name);
context.Response.ContentType = type;
context.Response.WriteFile(path);
context.Response.End();    

【问题讨论】:

  • 不能异步工作...
  • 文件下载是一个二进制 http 请求。 XmlHttpRequest 支持 AJAX。它们不兼容。由于必须启动点击,因此最好的办法是让 url 指向一个 .ashx 处理程序,该处理程序可以检索文件并在外部执行传递。

标签: asp.net xmlhttprequest


【解决方案1】:

所以,显然 AJAX 使用基于 XML 的 http 请求。这是一个不同的 协议比文件下载请求。文件下载是一个二进制文件 http 请求。

首先,虽然 XmlHttpRequest 对象可以将数据解析为 XML,但您也可以获取完整的数据,无论是否为二进制。你可以把它解析成你想要的任何东西。

其次,它不是不同的协议。协议是 HTTP。在这两种情况下,HTTP 都在传输数据并进行内容协商。

第三,HTTP GET 请求(两种情况下都是同一种请求)可以返回二进制或文本数据,完全独立于请求的生成方式。请求可以通过标签、用户点击链接或 XMLHttpRequest 生成,内容类型(二进制或文本)完全独立于请求的生成方式。

您不能使用 XMLHttpRequest 下载文件,而是必须使用特定于浏览器的扩展(例如 nsIWebBrowserPersist)的真正原因是,浏览器在读取从XMLHttpRequest,它们在为顶级页面读取数据时所做的方式(或者——您可以通过不可见的 iframe 获取数据来触发下载)

就个人而言,我认为这对网络浏览器来说是一个糟糕的选择,因为没有额外的安全性,只会给开发人员带来不便。除了 GET 之外,无法通过使用 IFRAME 或 IMG 元素发出请求来发送 Accept: 标头或动词,因此您无法控制内容协商。相反,您必须将 HTTP 协议转义为 GET 参数,我觉得这很可悲且不符合 REST。

有关 nsIWebBrowserPersist 的更多信息,请参阅https://developer.mozilla.org/en/Code_snippets/Downloading_Files

【讨论】:

    【解决方案2】:

    注意你的代码:

    var xmlHttp=new XMLHttpRequest();
    

    所以,显然 AJAX 使用基于 XML 的 http 请求。这是与文件下载请求不同的协议。文件下载是一个二进制 http 请求。

    有点喜欢在没有翻译的情况下说两种不同的语言。没用……

    因此,一种解决方案是创建一个指向 .ashx 处理程序的链接,该处理程序可以获取文件并将其发送到客户端

    【讨论】:

      猜你喜欢
      • 2014-05-08
      • 1970-01-01
      • 2012-12-25
      • 1970-01-01
      • 1970-01-01
      • 2023-04-03
      • 2014-05-25
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多