Jquery Ajax请求文件下载操作失败的原因分析及解决办法

jQuery确实是一个挺好的轻量级的JS框架,能帮助我们快速的开发JS应用,并在一定程度上改变了我们写JavaScript代码的习惯。

废话少说,直接进入正题,我们先来分析一下失败的原因

一、失败的原因

那是因为response原因,一般请求浏览器是会处理服务器输出的response,例如生成png、文件下载等,然而ajax请求只是个“字符型”的请求,即请求的内容是以文本类型存放的。文件的下载是以二进制形式进行的,虽然可以读取到返回的response,但只是读取而已,是无法执行的,说白点就是js无法调用到浏览器的下载处理机制和程序。

二、解决方案

1)可以使用jquery创建表单并提交实现文件下载;

var form = $("<form>"); form.attr("style","display:none"); form.attr("target",""); form.attr("method","post"); form.attr("action",rootPath + "T_academic_essay/DownloadZipFile.do"); var input1 = $("<input>"); input1.attr("type","hidden"); input1.attr("name","strZipPath"); input1.attr("value",strZipPath); $("body").append(form); form.append(input1); form.submit(); form.remove();

2)可以直接使用a标签实现文件下载;

<a href=”下载地址”>点击下载</a>

3)使用隐藏iframe或新窗体解决。

PS:AJAX请求 $.ajax方法的使用

使用jQuery的$.ajax方法可以更为详细的控制AJAX请求。它在AJAX请求上施加细粒度级别的控制。

$.ajax方法语法

$.ajax(options)

参数

options

(对象)一个对象的实例,其属性定义这个操作的参数。详情见下表。

返回值

XHR实例

options详细范围值

名称

类型

描述

url

字符串

请求的url地址

type

字符串

将要使用的HTTP方法。通常是POST或GET。如果省略,则默认为GET

data

对象

一个对象,其属性作为查询参数而传递请求。如果是GET请求,则把数据作为查询字符串传递;如果是POST请求,则把数据作为请求体传递。在这两种情况下,都是由$.ajax()实用工具函数来处理值的编码

dataType

字符串

一个关键字,用来标识预期将被响应所返回的数据的类型。这个值决定再把数据传递给回调函数之前(如果有)进行什么后续处理。有效值如下:

xml-响应文本被解析为XML文档,而作为结果的XML DOM被传递给回调函数

html-响应文本未经处理就被传递给回调函数。在已返回HTML片段内的任何<script>块将被求值

json-响应文本被求值为JSON字符串,而作为结果的对象被传递给回调函数

jsonp-与json相似,不同之处是提供远程脚本支持(假定远程服务器支持)

script-响应文本被传递给回调函数。在任何回调函数被调用之前,响应被作为一个或多个JavaScript语句而进行处理

text-响应文本被假定为普通文本。服务器资源负责设置适当的内容类型响应标头。如果省略这个属性,则不对响应文本进行任何处理或求值就传递给回调函数

timeout

数值

设置Ajax请求的超时值(毫秒)。如果请求在超时值到期之前仍未完成,则中止请求并且调用错误回调函数(如果已定义)

global

布尔型

启用或禁用全局函数的触发。这些函数可以附加到元素上,并且在Ajax调用的不同时刻或状态下触发。默认启用全局函数触发

contentType

字符串

将要在请求上指定的内容类型。默认为application/x-www-form-urlencoded(与表单提交所使用的默认类型相同)

success

函数

如果请求的响应指示成功状态码,则这个函数被调用。响应体作为第一个参数被返回给这个函数,并且根据指定的dataType属性进行。第二个参数是包含状态码的字符串—这种情况下永远为成功状态码

error

函数

如果请求的响应返回错误状态码,则这个函数被调用。三个实参被传递给这个函数:XHR实例、状态消息字符串(在这种情况下永远为错误状态码)以及XHR实例所返回的异常对象(可选)

complete

函数

请求完成时被调用。两个实参被传递:XHR实例和状态消息字符串(成功状态码或错误状态码)。如果也指定了success或error回调函数,则这个函数在success或error回调函数调用之后被调用

beforeSend

函数

在发起请求之前被调用。这个函数被传递XHR实例,并且可以用来设置自定义的标头或执行其他预请求操作

async

布尔型

如果指定为false,则请求被提交为同步请求。在默认的情况下,请求是异步的

processData

布尔型

如果设置为false,则阻止已传递数据被加工为URL编码格式。默认情况下,数据被加工为URL编码格式(适用于类型为application/x-www-form-urlencoded的请求)

ifModified

布尔型

如果设置为true,则自从上一次请求以来,只有在响应内容没有改变的情况下(根据Last-Modified标头)才允许请求成功。如果省略,则不执行标头检查

下面看个例子,尽可能多的用到options中的选项

客户端代码:

<html xmlns="http://www.w3.org/1999/xhtml"> <head> <title></title> <script src="Scripts/jquery-1.4.1.min.js" type="text/javascript"></script> <script type="text/javascript"> $().ready(function () {   $('#selectNum').change(function () {     var idValue = $(this).val();     var show = $('#show');     $.ajax({       url: 'Server.aspx',       type: 'POST',       data: { id: idValue },       //调小超时时间会引起异常       timeout: 3000,       //请求成功后触发       success: function (data) { show.append('success invoke!' + data+'<br/>'); },       //请求失败遇到异常触发       error: function (xhr, errorInfo, ex) { show.append('error invoke!errorInfo:' + errorInfo+'<br/>'); },       //完成请求后触发。即在success或error触发后触发       complete: function (xhr, status) { show.append('complete invoke! status:' + status+'<br/>'); },       //发送请求前触发       beforeSend: function (xhr) {       //可以设置自定义标头       xhr.setRequestHeader('Content-Type', 'application/xml;charset=utf-8');       show.append('beforeSend invoke!' +'<br/>');       },       //是否使用异步发送       async: true     })   }); }) </script> </head> <body> <select id="selectNum">   <option value="0">--Select--</option>   <option value="1">1</option>   <option value="2">2</option>   <option value="3">3</option> </select> <div id="show"></div> </body> </html>

服务端主要代码:

protected void Page_Load(object sender, EventArgs e) {   if (!Page.IsPostBack)   {     if (Request["id"] != null && !string.IsNullOrEmpty(Request["id"].ToString()))     {       //启用该句会引发ajax超时异常       // System.Threading.Thread.Sleep(3000);       Response.Write(GetData(Request["id"].ToString()));     }   } } protected string GetData(string id) {   string str = string.Empty;   switch (id)   {     case "1":       str += "This is Number 1";       break;     case "2":       str += "This is Number 2";       break;     case "3":       str += "This is Number 3";       break;     default:       str += "Warning Other Number!";       break;   }   return str; }

运行程序,结果如图:

时间: 2024-12-25 03:20:11

Jquery Ajax请求文件下载操作失败的原因分析及解决办法的相关文章

php resizeimage 部分jpg文件 生成缩略图失败的原因分析及解决办法_php实例

今天遇到GD的resizeimage 函数处理jpg后缀文件的缩略图的时候 提示该图片不是合法的jpg图片并报错 <b>Warning</b>: imagecreatefromjpeg(): gd-jpeg, libjpeg: recoverable error: Invalid SOS parameters for sequential JPEG 国内网上查了很多资料也没找到有效的解决办法,原来只要把 GD的jpeg文件支持打开即可解决 ini_set('gd.jpeg_igno

Win7蓝牙驱动安装失败的原因分析与解决方法

  蓝牙是一种支持设备短距离通信的无线电技术,现在不管是手机还是电脑都已经普遍的使用蓝牙功能了.如果Win7系统电脑没有安装蓝牙驱动的话,是需要安装后才能使用的.最近,有用户在安装蓝牙驱动的时候,发现安装失败.怎么办?出现这样的问题要怎么解决?现在就和大家说一下Win7蓝牙驱动安装失败的原因分析与解决方法. 步骤如下: 一.原因分析: 优化软件将系统INF文件夹自带文件误删了. 二.解决方法: 1.进入C盘系统分区的Windowsinf目录,查看是否有"bth.inf"文件,备注:如果

后端接收不到AngularJs中$http.post发送的数据原因分析及解决办法_AngularJS

1.问题: 后端接收不到AngularJs中$http.post发送的数据,总是显示为null 示例代码: $http.post(/admin/KeyValue/GetListByPage, { pageindex: 1, pagesize: 8 }) .success(function(){ alert("Mr靖"); }); 代码没有错,但是在后台却接收不到数据,这是为什么呢? 用火狐监控:参数是JSON格式 用谷歌监控:传参方式是request payload 可以发现传参方式是

微信零钱提现提示交易异常原因分析与解决办法

1.我们先来提现看看,我们在微信中点击[我]点击打开[零钱]如下所示; 2.进入之后我们再点击[提现]选项打开进入效果如下; 3.好了在此填写你要[提现]金额点击提现按钮; 4.输入你绑定银行卡时设定的支付密码; 5.好了这样就提交申请了,之后点击[完成]. 6.如果没有问题就会出现提现成功了,如我们现在点击[账户安全] 7.在弹出的窗口点击打开[交易异常]; 8.好了这是什么原因我们进入然后点击提示界面中的[点击此处]; 9.之后根据向导选择操作之后点击[提交]. 10.如果客服回复之后,还是

Android实现类似IOS右滑返回的效果(原因分析及解决办法)

使用类库SwipeBackLayout https://github.com/Issacw0ng/SwipeBackLayout 出现的问题: 1. 主Activity返回时黑屏或者返回只是看到桌面背景而没有看到上一个Activity界面 原因: 使用滑动返回需要在Activity的额主题中声明android:windowIsTranslucent=true,而该属性是设置Activity为是否为透明主题,当主Activity采用透明主题时,由于是app Activity栈中的第一个,所以滑动返

笔记本电池充不了电的四种原因分析和解决办法

  笔记本电池充不了电的四种原因分析和解决办法.不少网友会问,笔记本电池充不进电的原因是什么?笔记本电池不充电怎么办?笔记本电池不充电的4种原因分别是电源适配器故障,电池故障,主板故障,电路故障.那么我们该如何解决笔记本电池不充电这个问题呢? 一:电源适配器故障 电源适配器有很多朋友称之为充电器,虽然不够准确,但也确实很形象.判断是不是由于电源引起的不充电也很简单,替换法就可以.这种故障在DELL笔记本维修中多见,DELL笔记本采用LBK(DELL架構),充电电路设计比较特别,适配器如果出现问题

导致MyEclipse内存不足的原因分析及解决办法_java

1.修改eclipse.ini 在Myeclipse安装目录下G:\MyEclipse8.5\Genuitec\MyEclipse 8.5有一个myeclipse.ini配置文件,设置如下: -vmargs -Xmx512m -XX:MaxPermSize=256m -XX:ReservedCodeCacheSize=64m 2.设置Default VM Arguments 在myEclipse中,打开Windows-> Preferences->Java->Installed JREs

PHP中ID设置自增后不连续的原因分析及解决办法_php实例

PHP中ID设置自增后不连续的原因分析如下所述: alter table tablename drop column id; alter table tablename add id mediumint(8) not null primary key auto_increment first; 每次删除把这两行家伙加上就行了 还有就是这个 使用mysqli对象中的query()方法每次调用只能执行一条SQL命令. 如果需要一次执行多条SQL命令,就必须使用mysqli对象中的 multi_que

网站首页被百度K掉降权原因分析及解决办法

中介交易 SEO诊断 淘宝客 云主机 技术大厅 做seo的朋友都会遇到网站首页被百度K掉的时候,让人非常苦恼.因为平常对于企业网站优化来说,首页的关键词是整个网站主要关键词流量的来源.所以在做网站推广过程中遇到这样的问题都会让相关工作人员心急如焚.这里icp66网站建设工作室总结了一下网站首页被百度K掉或者是降权的原因以及处理方法. 网站首页被百度K掉降权原因分析及解决办法 网站首页过度优化:网站首页滥用优化标签,网站首页满篇的使用h标签或者着重和加强标签.导致百度搜索引擎认为是故意在seo优化