使用jQuery跨域上传文件



我的代码在同一个域中运行良好
但是当我使用dataType:'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。JSONP只处理GET请求。并且您不能使用GET请求上传文件(通常使用POST请求上传文件)。

若你们想发送跨域POST请求到某个服务器,那个么你们应该在下一种情况下确定:

该服务器应该向您发送标头Access-Control-Allow-Origin : *。此外,您可能需要Access-Control-Allow-Methods: POST标头。

如果它有这些头,那么你很幸运,你可以在这个服务器上发布你的数据。

附言:您可以尝试使用其他方法进行有效的跨域请求。很好的js库easyXDM用于跨域请求,witch使用不同的方法来实现。

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

JSONP

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

CORS

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

如何提出CORS请求:

这很简单,只需将AJAX调用中的url更改为其他域,客户端就不会进行其他更改

如果您的浏览器支持CORS,那么根据请求的类型(简单/复杂),可能会触发飞行前OPTIONS请求,以获取有关哪种类型的方法的信息;此域允许使用内容类型,并且将缓存此OPTIONS响应。

接下来,每当您对其他域进行AJAX调用时,在后台,浏览器都会发送一个Origin请求头。例如,如果谷歌的一个页面对facebook进行AJAX调用,那么类似这样的内容就会添加到请求头中

Origin: http://google.com

当脸书看到这个标题时,它会检查谷歌网站是否在他们允许的主机的有效列表中,并通过发送以下标题作为回应来同意这一点。

Access-Control-Allow-Origin: http://google.com

请注意,OriginAllow Origin头中的主机名应该匹配,以便浏览器接受并根据收到的响应采取行动。你甚至可以限制方法&通过在响应中设置以下标头允许的自定义标头

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标头,检查它是否在您的列表中,并在Allow Origin响应标头中设置相同的标头值。我不知道PHP,但希望它是这样的:)

<?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
?>

上的更多资源

  • CORS的历史
  • CORS上的5分钟视频
  • 针对复杂CORS请求的飞行前请求

希望这能回答您的问题:)

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

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

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

1:-您需要服务器的权限。类似访问控制允许来源:*。

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

3:-如果你想使用纯javascript,那么你可以使用这个链接-

如何在没有JQuery的情况下从Javascript发出JSONP请求?


正如人们所说的那样,GET不是实现这一目标的方法。我见过这种事情是通过隐藏的iFrame完成的。您可能可以找到各种jQuery插件来实现所需的结果,但我发现了一个名为"jQuery iFrame Transport"的插件
https://cmlenz.github.io/jquery-iframe-transport/
希望这会对你有所帮助。

您不能使用JSONP或GET请求上传文件。你确定它早些时候对同一来源有效吗?

您必须发送跨域XHR请求才能上传文件。您可以使用JQuery文件上传。https://github.com/blueimp/jQuery-File-Upload/wiki/Cross-domain-uploads

相关内容

  • 没有找到相关文章

最新更新