Extjs文件上传问题总结

  本来文件上传是一个简单而常用的功能,但是,由于刚刚接触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:400,
                height: 100,
                items: [
                {
                    xtype: ‘filefield‘,
                    fieldLabel: ‘文件上传‘,
                    labelWidth: 80,
                    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: 400,
                height: 150,
                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 > 0)
                {
                    String fileName = fileList[0].FileName;
                    //在ie浏览器下需要截取文件名称,因为获取的是上传文件的全路径,其他浏览器不需要截取
                    fileName = fileName.Substring(fileName.LastIndexOf("\\", StringComparison.Ordinal) + 1);
                    String uploadFilePath = context.Server.MapPath("/upload");
                    String fileSavePath = uploadFilePath + "\\" + fileName;
                    if (File.Exists(fileSavePath))
                    {
                        File.Delete(fileSavePath);
                    }
                    fileList[0].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 > 0)
                {
                    String fileName = fileList[0].FileName;
                    //在ie浏览器下需要截取文件名称,因为获取的是上传文件的全路径,其他浏览器不需要截取
                    fileName = fileName.Substring(fileName.LastIndexOf("\\", StringComparison.Ordinal) + 1);
                    String uploadFilePath = context.Server.MapPath("/upload");
                    String fileSavePath = uploadFilePath + "\\" + fileName;
                    if (File.Exists(fileSavePath))
                    {
                        File.Delete(fileSavePath);
                    }
                    fileList[0].SaveAs(fileSavePath);
                    context.Response.ContentType = "text/html";
                    context.Response.Write("{success:true,Msg:\"文件上传成功\"}");
                }
                else
                {
                    context.Response.Write("{success:false,Msg:\"请选择一个需要上传的文件\"}");
                }
            }
            catch (Exception)
            {
            }
        }

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

时间: 2024-10-15 07:39:51

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

struts2+extjs文件上传完整实现(解决了上传中的各种问题)

首先需要引入上传控件 <script type="text/javascript" src="<%=basePath%>/js/ext/examples/ux/fileuploadfield/FileUploadField.js" charset="utf-8"></script> 弹出上传框对应extjs代码 var uploadForm=new Ext.FormPanel({ id:'uploadForm'

PHP+ExtJS 文件上传示例

xtJS 4 有一个非常方便的文件上传组件,可以用来将文件上传到服务器.本文PHP教程UncleToo将介绍使用PHP和ExtJS实现文件上传功能. 首先,创建文件上传组件Ext.form.Panel,并添加一个上传按钮及按钮单击事件,该事件将验证并提交表单到upload.php的文件.看下面代码: ExtJS部分 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 3

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

原文地址:http://www.stepday.com/topic/?459 作文一个ExtJs的入门汉子,学习起来的确是比较费劲的事情,不过如今在这样一个网络资源如此丰富的时代,依然不是那么难了的.基本上都是Copy过来加以部分改造即可实现自己想要的功能,加之如今的第三方开发者也大发慈悲地写出了API的帮助文档以及示例文档.关于ExtJs内的文件上传,将从以下几个方面进行展开讲解: 一.ExtJs文件上传版面的布局以及配置 因为ExtJs的文件上传组件filefield是基于form表单提交数

Extjs中用dwr实现文件上传时,fileuploadfield不能正常显示的问题

当使用DWR调用Extjs的fileuploadfield 来做文件上传时,不能实现上传操作,需要修改dwr对应jar包中的engine.js文件 将1808行 var clone =value.cloneNode(true); 1812行  value.parentNode.insertBefore(clone,value); 注释掉 通过  var file = dwr.util.getValue("uploadFile");  获取fileuploadfield 对应的值 版权声

【ExtJs】ExtJs的文件上传

ExtJs的文件上传也是采用Ajax的方式,基本上,用户上传之后,其结果马上推回给前台.下面以一个ExtJs图片上传系统,说明这个问题. 一.基本目标 实现如下的一个图片上传的系统,不是基本图片格式,大于1M的图片不给予上传,上传成功显示图片,上传不成功,则显示错误信息. 二.基本思想 这个工程的目录结构如下, 如FileUpload.html的HTML布局所示,js与ext-theme-classic下面皆是Ext的基本资源.然后Upload文件夹用来存放上传的图片,FileUpload.ht

ExtJS 中文件上传控件

1 Ext.onReady(function(){ 2 var fileUpload = new Ext.FormPanel({ 3 id:'fileUpload', 4 frame:true, 5 fileUpload:true, 6 items:[{ 7 xtype:'textfield', 8 labelStyle : 'text-align:right;', 9 allowBlank:false, 10 fieldLabel:'选择文件', 11 inputType:'file', 12

extjs列表中文件上传与下载(带有重命名操作)

下面是extjs列表中文件上传与下载: 如图: 一.上传 上传按钮: { xtype: 'button', width: 60, margin: '0 20', text: ' 上 传 ', handler: 'onUploadClick' }] 上传按钮事件(打开上传窗口和传参): onUploadClick: function () { var me = this, view = me.getView(), vm = view.getViewModel(), store = me.getSt

ExtJS:文件上传实例

var ext_dateFormat = 'Y-m-d H:i:s'; var dateFormat = 'yyyy-MM-dd HH:mm:ss'; var date = new Date(); Ext.onReady(function() { var fifp =Ext.create('Ext.form.Panel', { renderTo: 'fi-form', width: 500, frame: true, title: '文件上传', bodyPadding: '10 10 0',

开源项目OkHttpPlus——支持GET、POST、UI线程回调、JSON格式解析、链式调用、文件上传下载

OkHttpPlus介绍 项目地址:https://github.com/ZhaoKaiQiang/OkHttpPlus 主要功能:OkHttp封装,支持GET.POST.UI线程回调.JSON格式解析.链式调用.小文件上传下载及进度监听等功能 为什么要写这么一个库呢? 首先,是因为OkHttp在4.4之后已经作为底层的Http实现了,所以OkHttp这个库很强大,值得我们学习. 其次,在我看来,OkHttp使用起来不如Volley方便,OkHttp的回调都是在工作线程,所以如果在回调里面操作V