使用Handler的ASP.NET XMLHTTPREQUEST下载文件

时间:2011-11-09 17:15:08

标签: asp.net xmlhttprequest

我正在尝试使用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();    

2 个答案:

答案 0 :(得分:1)

  

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

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

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

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

您无法使用XMLHttpRequest下载文件,但必须使用特定于浏览器的扩展(如nsIWebBrowserPersist)的原因是浏览器在读取返回的数据时选择不注意Content-Disposition标头来自XMLHttpRequest,它们在读取顶级页面数据时的方式(或者 - 您可以通过不可见的iframe获取数据来触发下载)

就我个人而言,我认为这是Web浏览器的不良选择,因为没有额外的安全性,只会给开发人员带来不便。通过发出带有IFRAME或IMG元素的请求,无法发送Accept:GET以外的标题或动词,因此您无法控制内容协商。相反,你必须将HTTP协议转换为GET参数,我发现这些参数很难过,而且还没有REST-ful。

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

答案 1 :(得分:0)

请注意您的代码:

var xmlHttp=new XMLHttpRequest();

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

当没有翻译时,有点像说两种不同的语言。不起作用......

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