我正在尝试使用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();
答案 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处理程序的链接,该处理程序可以获取文件并将其发送到客户端