跨域php会话上传进度堆栈


php session upload progress stack with cross domain

会话上传进度正常,但当我将from post url从pros.php更改为server_ip/pros.php并更改XMLHttpRequest时,JavaScript从获取url

t.open("GET","progress.php",false);

t.open("GET","server_ip/progress.php",false);

它不工作,所以我添加了progress.php header("Access-Control-Allow-Origin: *");,它仍然不工作

progress.hp:

  <?php 
error_reporting(0); 
header("Access-Control-Allow-Origin: *"); 
session_start(); 
$key = ini_get("session.upload_progress.prefix") . 'progressperc';
if(isset($_SESSION[$key]['bytes_processed']) 
   AND $_SESSION[$key]['bytes_processed'] != 0) { 
   $file_uploaded = true; 
   echo round($_SESSION[$key]['bytes_processed'] / $_SESSION[$key]['content_length'] * 100);
} elseif ($file_uploaded === true 
          AND $_SESSION[$key]['bytes_processed'] == 0) {
  echo 100; 
} 
?>

这是index.php中的js代码,用于获取进度

<script>window.setInterval(function(){var t;if(window.XMLHttpRequest){t=new XMLHttpRequest}else{t=new ActiveXObject("Microsoft.XMLHTTP")}t.onreadystatechange=function(){if(t.readyState==4&&t.status==200){if(t.responseText=="100"){document.getElementById("progress").style.width=t.responseText+"%"document.getElementById("progress").innerHTML=t.responseText+"%";clearInterval()}if(t.responseText!=""&&t.responseText!="100"){document.getElementById("progress").style.width=t.responseText+"%";document.getElementById("progress").innerHTML=t.responseText+"%"}}};t.open("GET","progress.php",false);t.send(null)},5e3)</script>

不同浏览器之间的访问控制允许来源不同。大多数时候,它只用于从一个域向另一个域提交表单。

默认情况下,跨域http请求是被禁止的,但您可以进行跨域json请求。您可以使progress.php以json格式返回,并带有标题:

content-type:application/json.

如果你只想显示上传进度值,你也可以尝试使用JS破解(通过在html中添加新标签,脚本就会运行),或者制作进度图像(更新img src)。两者都100%致力于所有Broswer。