Extjs的form跨域提交文件时,无法获取返回结果

form文件表单跨域提交时,无法获取远程服务器的返回结果,form提交代码如下:

form.submit({
    url:‘http://{remoteUrl}/hgisserver/wrds/file‘,
    waitMsg: ‘Reading your file...‘,
    method : ‘POST‘,
    success: function(fp, o) {
     console.log(o);
    },
    failure: function(form, action) {
        console.log(action);
    }
});

报错如下:

"{success:false,message:"Blocked a frame with origin "http://localhost:8080" from accessing a cross-origin frame."}"

为解决这个问题,中间比较坎坷,http://blog.csdn.net/caostorm/article/details/74392158该博客的解决办法,我在extjs-4.2.1版本下试了没有效果,Content-Type仍然为text/plain.

现总结得到如下两种解决方案:

远程服务器已经设置了跨域请求,文件已经上传到远程服务器了,只是由于form新开的iframe无法接收服务器的返回结果。解决办法如下:

1、通过PHP代理转发请求和返回结果;

2、采用jquery的ajax请求;

第一种方法比较复杂,需设置php环境,避免文件过大无法上传,若直接将临时文件转发,文件名的传入还需在后台解析时注意;

form提交时代吗修改为:

form.submit({
    url: ‘/php/formCrosUpload.php‘,
    params:{
        remoteUrl: "http://{remoteUrl}/hgisserver/wrds/file"
    }
    waitMsg: ‘Reading your file...‘,
    method : ‘POST‘,
    success: function(fp, o) {
        console.log(action);
    },
    failure: function(form, action) {
        console.log(action);
    }
});

php处理:

<?php
    header("Access-Control-Allow-Origin:*");
    header("Access-Control-Allow-Methods:POST");

    function curlPost($url,$postData)
    {
       $ch = curl_init();
       curl_setopt($ch,CURLOPT_URL,$url);
       curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
       curl_setopt($ch,CURLOPT_HEADER, false);
       curl_setopt($ch, CURLOPT_POST, count($postData));
       curl_setopt($ch, CURLOPT_POSTFIELDS, $postData);
       $output=curl_exec($ch);
       curl_close($ch);
       return $output;
    }

    $url = trim($_POST[‘remoteUrl‘]);
    $file = $_FILES[‘form-file‘];
    $tmpFile = $file["tmp_name"];

    if($file["error"] > 0){
      echo "file upload error:".$file["error"];
    }
    else{
        $post_data = array (
          $file[‘name‘] => ‘@‘. $tmpFile  //将文件名通过Field的key传入,后台解析时需注意,$tmpFile是临时文件,文件名为null
        );
        echo curlPost($url,$post_data);
    }

?>

在工程配置web.xml文件制定的php.ini配置文件中设置设置php的文件上传大小限制:

web.xml:
    ......
    <init-param>
      <param-name>ini-file</param-name>
      <param-value>WEB-INF/php.ini</param-value>
    </init-param>
    ......

php.ini:

upload_max_filesize = 50M   //最大上传文件大小
post_max_size = 50M      //最大POST大小
memory_limit = 128M     //内存限制
max_execution_time = 30  //最大执行时间
max_input_time = 60    //最大输入时间

第二种方法比较简单,可增加等待提示框,实现与form提交等待同样的效果;通过FormData装载form文件,然后POST到远程服务器

代码如下:

    var fileEl = Ext.getCmp(‘form-file‘).fileInputEl.dom;
    var fd = new FormData();
    fd.append("file", fileEl.files[0]);

    var msg = new Ext.window.MessageBox();
    msg.wait(‘Upload your file...‘);
    $.ajax({
        url: ‘http://{remoteUrl}/hgisserver/wrds/file‘,
        type: ‘POST‘,
        cache: false,
        data: fd,
        processData: false,
        contentType: false,
        dataType:"json",
        beforeSend: function(){
            uploading = true;
        },
        success : function(data) {
            console.log(data);
            form.reset();
        },
        error: function(data) {
            Ext.Msg.alert(‘Fail‘, ‘Upload File failed.‘);
        },
        complete: function(){
            msg.close();
        }
    });

原文地址:https://www.cnblogs.com/HandyLi/p/8624468.html

时间: 2024-12-11 13:55:54

Extjs的form跨域提交文件时,无法获取返回结果的相关文章

使用jQuery实现跨域提交表单数据

我们在WEB开发中有时会遇到这种情况,比如要从A网站收集用户信息,提交给B网站处理,这个时候就会涉及到跨域提交数据的问题.本文将给您介绍如何使用jQuery来实现异步跨域提交表单数据. 在jQuery中,我们使用json数据类型,通过getJSON方法来实现从服务端获取或发送数据,而当要向不同远程服务器端提交或者获取数据时,要采用jsonp数据类型.使用这种类型的话,会创建一个查询字符串参数 callback=? ,这个参数会加在请求的URL后面.服务器端应当在JSON数据前加上回调函数名,以便

代替jquery $.post 跨域提交数据的N种形式

跨域的N种形式: 1.直接用jquery中$.getJSON进行跨域提交 优点:有返回值,可直接跨域: 缺点:数据量小: 提交方式:仅get (无$.postJSON) $.getJSON("http://www.sendnet.cn/?callback=?" , { UserId: 1001 }, function (data) { alert(data.info); }); $.ajax({ type: "Get", url: "http://www.

妥善的ajax跨域提交post请求的解决方案,结合PHP与jquery

开发背景: 在开发中采用了一个新的架构,将大部分客户的留言功能集成到一个公共API提交保存,采用不同的用户名区分,供客户查询自己网站的留言,这样节约了客户网站的资源,也提升了维护性. 那么在提交时不能采用直接的post提交,否则会产生跳转,使访客混乱,所以采用ajax提交留言内容至公共服务器:http://wx.igooda.cn/index.php/messagesave,但尝试后发现不能提交post请求,百度后查询结果是跨域只能是get请求,这对留言内容多的来说,是不可行的.还有一种解决方案

[转载]解决flash与js交互、flash跨域交互、flash跨域提交

http://blog.csdn.net/andyxm/article/details/5219919 我们引用本地flash,实现flash与js双向交互. function thisMovie(movieName) {     if (window.document[movieName]){      return window.document[movieName];    }else if (navigator.appName.indexOf("Microsoft")==-1)

flash跨域策略文件crossdomain.xml配置详解

来源:http://www.2cto.com/Article/201108/100008.html 0x01 简介 flash在跨域时唯一的限制策略就是crossdomain.xml文件,该文件限制了flash是否可以跨域读写数据以及允许从什么地方跨域读写数据. 位于www.a.com域中的SWF文件要访问www.b.com的文件时,SWF首先会检查www.b.com服务器目录下是否有crossdomain.xml文件,如果没有,则访问不成功:若crossdomain.xml文件存在,且里边设置

ServiceStack支持跨域提交

//ServiceStack对浏览器有一定的限制 //修改AppHost.cs文件 using Funq;using ServiceStack;using ServiceStackTest.ServiceInterface; namespace ServiceStackTest{ public class AppHost : AppHostBase { /// <summary> /// Default constructor. /// Base constructor requires a

jquery Ajax 通过jsonp的方式跨域提交表单

Jquery Ajax可以通过jsonp的方式跨域提交表单,至于什么是跨域提交简单说就是你的客户端和服务端不在同一个域名下或端口号不同也可以叫做跨域. 前台代码: $.ajax({ type : 'get', async: false, url : '${pageContext.request.contextPath}/clue/uploadForm', dataType : 'jsonp', data: { mydata : JSON.stringify(obj,fm), formId : f

关于跨域策略文件crossdomain.xml文件

下载flexpaper源码修改后做成swf阅读器,要加入待阅读的swf文件,可以在flex里调用js的方法来获取swf文件的路径的方法,在js只专注获取路径就行,等着flex来调用:但这里会遇到一个问题那就是出现安全问题,如下的提示: Error #2044: 未处理的 onDocumentLoadedError:. text=Error #2048: 安全沙箱冲突:http://localhost:8080/UpLoadAndDownLoad/FlexPaper.swf 不能从 http://

跨域提交

本文实现常用的跨域提交,并非ajax提交: 一.HTML表单: <form id="fm" name="FM" action="server.aspx" method="post" target="ajaxiframe"> <input type="text" name="tit" value="标题" /> <inp