本来文件上传是一个简单而常用的功能,但是,由于刚刚接触extjs,对extjs中的控件及其使用方法并不熟悉,导致本来一个很快就可以搞定的文件上传问题,弄了将近两天的时间。现将问题及解决办法发出来,供有相同烦恼的博园参考。只是我第一次发文,如有不妥,望各位海涵。

  问题描述:在文件上传的时候,在ie浏览器下,文件上传成功以后返回response时,回调函数直接报错:无法调用null或者空值的success属性。

  首先看下extjs的代码:

<html xmlns="http://www.w3.org/1999/xhtml">
<head runat="server">
<meta http-equiv="Content-Type" content="text/html; charset=utf-8"/>
<title></title>
<link href="Content/Extjs/resources/css/ext-all.css" rel="stylesheet" />
<script src="Content/Extjs/ext-all-debug.js" type="text/javascript"></script>
<script src="Content/Extjs/ext-lang-zh_CN.js" type="text/javascript"></script>
<script type="text/javascript">
Ext.onReady(function() { var uploadForm = Ext.create('Ext.form.Panel', {
width:,
height: ,
items: [
{
xtype: 'filefield',
fieldLabel: '文件上传',
labelWidth: ,
msgTarget: 'side',
allowBlank: false,
margin: '10,10,10,10',
anchor: '100%',
buttonText:'选择文件'
}],
buttons:[
{
text: '上传',
handler: function() {
uploadForm.getForm().submit({
url: 'ExtFormSubmitAjax.ashx',
params: {
action: 'UploadFile'
},
success: function(form, action) {
var jsonResult = Ext.JSON.decode(action.response.responseText);
if (jsonResult.success) { }
Ext.Msg.alert('提示', jsonResult.Msg);
} });
}
}, {
text: '取消',
handler: function() { }
}],
buttonAlign:'center' }); var mainPanel = Ext.create('Ext.panel.Panel', {
renderTo: 'layoutDiv',
width: ,
height: ,
margin: '50,50,50,50',
items: [uploadForm]
}); }); </script>
</head>
<body>
<div id="layoutDiv"></div>
</body>
</html>

  这就是一个简单的文件上传的Extjs代码,由于测试,写的有些凌乱。当点击上传后,调用后台的文件上传代码:

        public void UploadFile(HttpContext context)
{
try
{
HttpFileCollection fileList = context.Request.Files;
if (fileList.Count > )
{
String fileName = fileList[].FileName;
//在ie浏览器下需要截取文件名称,因为获取的是上传文件的全路径,其他浏览器不需要截取
fileName = fileName.Substring(fileName.LastIndexOf("\\", StringComparison.Ordinal) + );
String uploadFilePath = context.Server.MapPath("/upload");
String fileSavePath = uploadFilePath + "\\" + fileName;
if (File.Exists(fileSavePath))
{
File.Delete(fileSavePath);
}
fileList[].SaveAs(fileSavePath);
context.Response.Write("{success:true,Msg:\"文件上传成功\"}");
}
else
{
context.Response.Write("{success:false,Msg:\"请选择一个需要上传的文件\"}");
}
}
catch (Exception)
{
}
}

  按理说这样就可以完成文件上传的操作,但是,我的程序在ie上运行,就是报错。一直提示在ext-all-debug.js中的这里报错:

    onSuccess: function(response) {
var form = this.form,
success = true,
result = this.processResponse(response);
if (result !== true && !result.success) {
if (result.errors) {
form.markInvalid(result.errors);
}
this.failureType = Ext.form.action.Action.SERVER_INVALID;
success = false;
}
form.afterAction(this, success);
},   提示result为null,无法调用空值的success属性。其实原因就是返回的response对象种的responseText的值被ie自动添加了一个<pre>标签所致。
  导致在 this.processResponse(response)时,没有办法将一个字符串解析成json格式,所以ext-all-debug.js的源码中就会报错。
  要声明的是,这段代码在谷歌、火狐等其他浏览器中没有问题,我相信在一部分的ie中也没有问题,可能碰到高版本ie才会出现这样的奇葩问题。

  其实知道了问题的所在,解决办法就相对简单了。我们只要在后台代码返回json的时候,为response对象设置一个contentType属性就可以了,代码如下:

        public void UploadFile(HttpContext context)
{
try
{
HttpFileCollection fileList = context.Request.Files;
if (fileList.Count > )
{
String fileName = fileList[].FileName;
//在ie浏览器下需要截取文件名称,因为获取的是上传文件的全路径,其他浏览器不需要截取
fileName = fileName.Substring(fileName.LastIndexOf("\\", StringComparison.Ordinal) + );
String uploadFilePath = context.Server.MapPath("/upload");
String fileSavePath = uploadFilePath + "\\" + fileName;
if (File.Exists(fileSavePath))
{
File.Delete(fileSavePath);
}
fileList[].SaveAs(fileSavePath);
context.Response.ContentType = "text/html";
context.Response.Write("{success:true,Msg:\"文件上传成功\"}");
}
else
{
context.Response.Write("{success:false,Msg:\"请选择一个需要上传的文件\"}");
}
}
catch (Exception)
{
}
}

  这样就可以了,ie下就可以原样输出response对象的响应信息。希望对 遇到相同问题的博员有所帮助,晚安各位

Extjs文件上传问题总结的更多相关文章

  1. PHP+ExtJS 文件上传示例

    xtJS 4 有一个非常方便的文件上传组件,可以用来将文件上传到服务器.本文PHP教程UncleToo将介绍使用PHP和ExtJS实现文件上传功能. 首先,创建文件上传组件Ext.form.Panel ...

  2. 自定义ExtJS文件上传

    日常工作中,一般文件上传都是跟随表单一起提交的,但是遇到form表单中有许多地方有文件上传时这种方式却不是很适用,以下是我工作中用的文件上传方式: { xtype: 'fileuploadfield' ...

  3. struts2+extjs文件上传完整实现(攻克了上传中的各种问题)

    版权声明:本文为博主原创文章.未经博主同意不得转载. https://blog.csdn.net/shanhuhau/article/details/28617999 首先须要引入上传控件 <s ...

  4. ExtJs文件上传(Ext.ux.form.FileUploadField)

    Ext.ux.form.FileUploadField = Ext.extend(Ext.form.TextField, { /**  * @cfg {String} buttonText The b ...

  5. extjs文件上传

    EXT学习教程:http://www.cnblogs.com/iamlilinfeng/category/385121.html Ext文件上传: 例子用到的jar:   1.upload.js /* ...

  6. Extjs 文件上传

    function fromExcel(){ var dxjgdm_sel = Ext.get("dxjgdm").getValue(); var dxjglx_sel = Ext. ...

  7. [转]ExtJs入门之filefield:文件上传的配置+结合Ajax完美实现文件上传的asp.net示例

    原文地址:http://www.stepday.com/topic/?459 作文一个ExtJs的入门汉子,学习起来的确是比较费劲的事情,不过如今在这样一个网络资源如此丰富的时代,依然不是那么难了的. ...

  8. extjs插件开发上传下载文件简单案例

    前台,extjs,框架,mybatis,spring,springMVC,简单的文件上传下载案例. 必要的jar包,commons-fileupload-1.3.1.jar,commons-io-2. ...

  9. extjs实现简单的多文件上传(不借助任何插件),以及包含处理上传大文件的错误的各种处理办法

    在extjs的学习过程中,有遇到过有关多文件上传的问题,但是网上的大多数都是专门的去实现多文件上传而去做的组件之类的,没有特别简单的方式,于是小白便做了下面的内容,只是通过动态的去添加extjs的自带 ...

随机推荐

  1. SVN的基本操作

    右键SVN Commit 提交成功了,我们把SVN的服务器端刷新一下 所有的操作如果只是删除本地的文件都不会影响服务器端的文件,除非右键SVN Commit删除文件或者是新增文件才会对服务器端的仓库里 ...

  2. River Hopscotch

    River Hopscotch http://poj.org/problem?id=3258 Time Limit: 2000MS   Memory Limit: 65536K Total Submi ...

  3. Petya and Array (权值线段树+逆序对)

    Petya and Array http://codeforces.com/problemset/problem/1042/D time limit per test 2 seconds memory ...

  4. ASP.NET使用ListView数据绑定控件和DataPager实现数据分页显示(一)

    为什么使用ListView+DataPager的方式实现分页显示? .net提供的诸多数据绑定控件,每一种都有它自己的优点和缺点.如果需要对数据进行操作,如果数据量不大的情况下,DataList和Gr ...

  5. FileUpload控件实现单按钮图片自动上传并带预览显示

    FileUpload控件实现单按钮图片自动上传并带预览显示 1.实现原理:   FileUpload控件默认不支持服务端的ONCHANGE事件,此时用一种变通的方法借用客户端的onchange事件,调 ...

  6. nginx反向代理部署与演示(二)

    我们把LB01作为负载均衡器,WEB01和WEB02作为两台web服务器.   WEB01与WEB02虚拟主机配置如下:   我们修改nginx下的conf/nginx.conf文件,在http{}中 ...

  7. discuz回贴通知插件实现-发送邮件

    通过discuz的sendmail()来发送邮件 //引入发送邮件的函数文件 include libfile('function/mail'); //设置收件人地址,标题,内容发送邮件 sendmai ...

  8. [SoapUI] Command-Line Arguments

    https://support.smartbear.com/readyapi/docs/soapui/running/automating/cli.html Use the test runner t ...

  9. python list和函数之间的复制和原地址修改问题

    def change(a): a.pop() #自带的方法都是原地址修改 a=[,,] change(a) print (a)#直接修改了3. def change(a): a=[,,,] #复制操作 ...

  10. Microsoft DirectX SDK 2010 版本下载

    Microsoft DirectX SDK 2010 版本下载 Version:Date Published:9.29.19626/7/2010File name:File size:DXSDK_Ju ...