Javascript 使用jQuery跨域文件上载

Javascript 使用jQuery跨域文件上载,javascript,jquery,ajax,cross-domain,Javascript,Jquery,Ajax,Cross Domain,我的代码在同一个域中运行良好。 但是,当我使用数据类型在跨域上尝试时:“jsonp”&跨域:true 代码示例- var fa = new FormData(); fa.append("upload_pass", document.getElementById("upload_pass").files['0']); $.ajax({ url: 'http://xxx.xx.xx.xx/upload.php', data: fa, contentType: fa

我的代码在同一个域中运行良好。
但是,当我使用数据类型在跨域上尝试时:“jsonp”&跨域:true
代码示例-

var fa = new FormData();

fa.append("upload_pass", document.getElementById("upload_pass").files['0']);

$.ajax({    
    url: 'http://xxx.xx.xx.xx/upload.php',
    data: fa,
    contentType: false,
    processData: false,
    dataType: 'jsonp',
    crossDomain: true,
    type: 'GET',
    success: function(data) {
        alert(data);
    }
});
是否存在概念理解差距或编码问题。

请建议。

除了GET,您不能使用JSONP发出任何类型的请求。您不能使用GET请求上传文件(除非它是一个非常小的文件,可以用JavaScript读取并转换为可以作为常规表单数据处理的字符串)


您需要切换到使用带有CORS的POST(或同一来源上的代理)来禁用同一来源策略。

除了GET,您不能使用JSONP发出任何类型的请求。您不能使用GET请求上传文件(除非它是一个非常小的文件,可以用JavaScript读取并转换为可以作为常规表单数据处理的字符串)


您需要切换到使用带有CORS的POST(或同一来源上的代理)来禁用同一来源策略。

无法通过GET上载文件。即使您将使用JSONP。 JSONP只处理GET请求。而且你不能用GET请求上传文件(通常用POST请求上传文件)

如果要向某个服务器发送跨域POST请求,则应确保在下一种情况下:

该服务器应向您发送头
访问控制允许源:
。此外,您可能需要
访问控制允许方法:POST
标题

如果它有这些标题,那么您很幸运,您可以在此服务器上发布您的数据


另外,您可以尝试使用其他方法进行有效的跨域请求。很适合跨域请求,witch使用不同的方法来实现。

无法通过GET上传文件。即使您将使用JSONP。 JSONP只处理GET请求。而且你不能用GET请求上传文件(通常用POST请求上传文件)

如果要向某个服务器发送跨域POST请求,则应确保在下一种情况下:

该服务器应向您发送头
访问控制允许源:
。此外,您可能需要
访问控制允许方法:POST
标题

如果它有这些标题,那么您很幸运,您可以在此服务器上发布您的数据


另外,您可以尝试使用其他方法进行有效的跨域请求。很适合跨域请求,witch使用不同的方法来完成。

对于跨域工作,您需要这些东西-

1:-您需要服务器的权限。像访问控制一样,允许源代码:*

2:-如果您使用的是jquery,那么您可以使用jsonp方法

3:-如果您想使用纯javascript,则可以使用此链接-


对于跨领域工作,您需要这些东西-

1:-您需要服务器的权限。像访问控制一样,允许源代码:*

2:-如果您使用的是jquery,那么您可以使用jsonp方法

3:-如果您想使用纯javascript,则可以使用此链接-


JSONP和CORS是两个完全不同的东西

JSONP 带填充的JSON只是一种利用下载javascript文件时没有同源策略限制的黑客行为。由于您只能下载脚本,我们使用内置的数据格式JSON,而不是XML或HTML。此外,您还可以使用JSONP仅发出GET请求,因为它所做的只是创建一个
脚本,将
src
设置为其他域,并将其附加到您的DOM中,一旦下载,它就会被执行,这就是使用回调从传递JSON对象的原始域调用代码的时候

科尔斯 跨源资源共享是W3C的标准,它允许从另一个域请求网页上的许多资源(例如字体、JavaScript等)。您不仅限于使用justget,还可以使用所有常用的HTTP方法,如POST、HEAD、PUT、DELETE和其他方法

您如何提出CORS请求: 这就像将AJAX调用中的url更改为其他域一样简单,就是这样,客户端没有其他更改

如果您的浏览器支持CORS,则根据请求类型(简单/复杂),可能会触发飞行前选项请求,以获取有关此域允许的方法类型和内容类型的信息,并将缓存此选项响应

向前看,每当您在幕后对其他域进行AJAX调用时,浏览器都会发送一个
Origin
请求头。例如,如果一个来自google的页面向facebook发出AJAX调用,类似的内容会添加到请求头中

Origin: http://google.com
当facebook看到此标题时,它将检查google.com是否在其有效的允许主机列表中,并通过发送以下标题作为响应来对此表示同意

Access-Control-Allow-Origin: http://google.com
请注意,源站允许源站标题中的主机名应匹配,以便浏览器接受并对收到的响应采取行动。您甚至可以通过在响应中设置以下标头来限制允许的方法和自定义标头

Access-Control-Allow-Methods: POST, GET, OPTIONS
Access-Control-Allow-Headers: X-PINGOTHER
最后,要回答您的问题,请更改Ajax定义,如下所示

$.ajax({    
    url: 'http://some-other-domain.com/upload.php',
    data: fa,
    contentType: false,
    processData: false,
    type: 'POST',
    success: function(data) {
        alert(data);
    }
});
由于您只是对文件执行一个简单的POST调用,这是一个简单的请求,所以Allow Origin头就足够了。在PHP中,阅读
Origin
标题检查是否在列表中,并在alloworiginresponse标题中设置相同的标题值。我不知道PHP,但希望它是这样的:)


更多资源


希望这能回答你的问题:)JSONP和CORS完全是两码事

JSONP 带填充的JSON只是一种利用下载javascript文件时没有同源策略限制的黑客行为。由于您只能下载脚本,我们使用内置的数据格式JSON,而不是XML或HTML。此外,您还可以使用JSONP仅发出GET请求,因为它所做的一切
<?php
$headers = apache_request_headers();

  foreach ($headers as $header => $value) {
     if($header == "Origin"){
        /* check if $value is in your list
         if yes, set the response header */
         header('Access-Control-Allow-Origin: $value');
         /* adding just this header will allow any method from this 
            domain, in case you need to allow only POST method add
            Access-Control-Allow-Methods header as well */
         break;
      }
  }
  // do the remaining processing of request
?>