PHP跨域上传的几种方法

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了PHP跨域上传的几种方法相关的知识,希望对你有一定的参考价值。

方法一:
文件夹:/home/web/attachments
虚拟二级目录到/home/web/zxsv/下(支持同局域网的服务器)
​这样多个子域名进行上传的设计时,只需要attachments目录映射为相关的域名的二级目录,这样就可实现多个子域名共享一个附件服务器了,这种方法最好是用局域网中的附件服务器,这样流量是分开的,当然访问附件的域名是apache,ngixn,IIS等的虚拟二级目录就不说了,好处是现有程序不做任何修改,唯一坏处就是两台服务器必须在一个局域网中,当然你用单台也就没这个问题了
方法二:FTP同步更新
php是支持FTP的,给个FTP类里面(不是我写的,只是加了个建立多级目录),自己看着办吧,上传后调用FTP类,同步到FTP服务器中,好处是现有程序只需要在上传那段加上FTP上传就行了,坏处就是一定要支持FTP
<?php
$ftp=new Ftp;
//print_r($ftp->nlist(”"));
$ftp->makedir(”3″);
//$ftp->put(”comment.php”,”1.txt”);
$ftp->bye();
//R FTP 处理;
class ftp
var $ftpUrl = ‘www.zxsv.com’;
var $ftpUser = ‘zxsv’;
var $ftpPass = ‘111111′;
var $ftpDir = ‘/zxsv/’;
var $ftpR = ”; //R ftp资源;
var $status = ”;
//R 1:成功;2:无法连接ftp;3:用户错误;
function ftp()
if ($this->ftpR = ftp_connect($this->ftpUrl, 21))
if (ftp_login($this->ftpR, $this->ftpUser, $this->ftpPass))
if (!empty($this->ftpDir))
ftp_chdir($this->ftpR, $this->ftpDir);

ftp_pasv($this->ftpR, true);//R 启用被动模式;
$status = 1;
else
$status = 3;

else
$status = 2;


//R 切换目录;
function cd($dir)
return ftp_chdir($this->ftpR, $dir);

//建立目录
function mkdir($dir)
return ftp_mkdir($this->ftpR, $dir);

function makedir($dir)
if(!$dir) return 0;
$dir = str_replace( “\\\\”, “/”, $dir );
$mdir = “”;
foreach(explode( “/”, $dir ) as $val )
$mdir .= $val.”/”;
if( $val == “..” || $val == “.” ) continue;
if(!@mkdir($mdir))
echo “创建目录 [".$mdir."]失败.”;
//exit;


return true;

//删除目录
function rmdir($dir)
return ftp_rmdir($this->ftpR, $dir);

//R 返回当前路劲;
function pwd()
return ftp_pwd($this->ftpR);

//R 上传文件;
function put($localFile, $remoteFile = ”)
if ($remoteFile == ”)
$remoteFile = end(explode(’/\', $localFile));

$res = ftp_nb_put($this->ftpR, $remoteFile, $localFile, FTP_BINARY);
print_r($res);
while ($res == FTP_MOREDATA)
$res = ftp_nb_continue($this->ftpR);

if ($res == FTP_FINISHED)
return true;
elseif ($res == FTP_FAILED)
return false;


//R 下载文件;
function get($remoteFile, $localFile = ”)
if ($localFile == ”)
$localFile = end(explode(’/\', $remoteFile));

if (ftp_get($this->ftpR, $localFile, $remoteFile, FTP_BINARY))
$flag = true;
else
$flag = false;

return $flag;

//R 文件大小;
function size($file)
return ftp_size($this->ftpR, $file);

//R 文件是否存在;
function isFile($file)
if ($this->size($file) >= 0)
return true;
else
return false;


//R 文件时间
function fileTime($file)
return ftp_mdtm($this->ftpR, $file);

//R 删除文件;
function unlink($file)
return ftp_delete($this->ftpR, $file);

function nlist($dir = ‘/service/resource/’)
return ftp_nlist($this->ftpR, $dir);

//R 关闭连接;
function bye()
return ftp_close($this->ftpR);


?>
参考技术A 1、用file_get_contents方法

class a
function test($i) // $i可以是任何类型的变量
print_r $i;



2、用Curl方法实现
$host = 'url';
$ch = curl_init();
curl_setopt($ch, CURLOPT_URL, $host);
// 返回结果
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch, CURLOPT_HEADER, 0);
// 使用POST提交
curl_setopt($ch, CURLOPT_POST, 1);
// POST参数
$str = array('a=1','b=2','c=3');
curl_setopt($ch, CURLOPT_POSTFIELDS, $str);
// 结果
$res = curl_exec($ch);
curl_close($ch);
注意:使用curl库之前,需要查看一下php.ini,查看是否已经打开curl扩展。
3、用fopen打开url, 以get方式获取内容

<?php
$url="http://www.dnjs.net/";
$fp=fopen($url,'r');
while(!feof($fp))
$result.=fgets($fp,1024);

echo" $result";
fclose($fp);
?>

javascript跨域的几种方法

以下的例子包含的文件均为为 http://www.a.com/a.html 、http://www.a.com/c.html 与 http://www.b.com/b.html,要做的都是从a.html获取b.html里的数据

1.JSONP

jsonp是利用script标签没有跨域限制的特性,通过在srcurl的参数上附加回调函数名字,然后服务器接收回调函数名字并返回一个包含数据的回调函数

  function doSomething(data) {
        // 对data处理
    }
    var script = document.createElement("script");
    script.src = "http://www.b.com/b.html?callback=doSomething";
    document.body.appendChild(script);

    // 1.生成一个script标签,将其append在body上,向服务器发出请求
    // 2.服务器根据 callback 这个参数生成一个包含数据的函数 doSomething({"a", "1"})
    // 3.页面事先已声明doSomething函数,此时执行 doSomething(data) 这个函数,获得数据

 

2.HTML5的postMessage

假设在a.html里嵌套个<iframe src="http://www.b.com/b.html" frameborder="0"></iframe>,在这两个页面里互相通信

a.html

 window.onload = function() {
        window.addEventListener("message", function(e) {
            alert(e.data);
        });

        window.frames[0].postMessage("b data", "http://www.b.com/b.html");
    }

 

b.html

 window.onload = function() {
        window.addEventListener("message", function(e) {
            alert(e.data);
        });
        window.parent.postMessage("a data", "http://www.a.com/a.html");
    }

 

这样打开a页面就先弹出 a data,再弹出 b data

3.window.name + iframe

window.name的原理是利用同一个窗口在不同的页面共用一个window.name,这个需要在a.com下建立一个代理文件c.html,使同源后a.html能获取c.htmlwindow.name

a.html

 var iframe = document.createElement("iframe");
    iframe.src = "http://www.b.com/b.html";
    document.body.appendChild(iframe); // 现在a.html里建一个引用b.html的iframe,获得b的数据

    var flag = true;
    iframe.onload = function() {
        if (flag) {
            iframe.src = "c.html";  
// 判断是第一次载入的话,设置代理c.html使和a.html在同目录同源,这样才能在下面的else取到data
            flag = false;
        } else { // 第二次载入由于a和c同源,a可以直接获取c的window.name
            alert(iframe.contentWindow.name);

            iframe.contentWindow.close();
            document.body.removeChild(iframe);
            iframe.src = ‘‘;
            iframe = null;
        }
    }

 

b.html

window.name = "这是 b 页面的数据";
 

4.window.location.hash + iframe

b.html将数据以hash值的方式附加到c.htmlurl上,在c.html页面通过location.hash获取数据后传到a.html(这个例子是传到a.htmlhash上,当然也可以传到其他地方)

a.html

 var iframe = document.createElement("iframe");
    iframe.src = "http://www.b.com/b.html";
    document.body.appendChild(iframe); // 在a页面引用b
    function check() { // 设置个定时器不断监控hash的变化,hash一变说明数据传过来了
        var hashs = window.location.hash;
        if (hashs) {
            clearInterval(time);
            alert(hashs.substring(1));
        }
    }
    var time = setInterval(check, 30);

 

b.html

window.onload = function() {
        var data = "this is b‘s data"; 
        var iframe = document.createElement("iframe");
        iframe.src = "http://www.a.com/c.html#" + data;
        document.body.appendChild(iframe); // 将数据附加在c.html的hash上
    }
 

c.html

// 获取自身的hash再传到a.html的hash里,数据传输完毕
parent.parent.location.hash = self.location.hash.substring(1); 
 

5.CORS

CORSXMLHttpRequest Level 2 里规定的一种跨域方式。在支持这个方式的浏览器里,javascript的写法和不跨域的ajax写法一模一样,只要服务器需要设置Access-Control-Allow-Origin: *

6.document.domain

这种方式适用于主域相同,子域不同,比如http://www.a.comhttp://b.a.com
假如这两个域名下各有a.html 和b.html,

a.html

document.domain = "a.com";
    var iframe = document.createElement("iframe");
    iframe.src = "http://b.a.com/b.html";
    document.body.appendChild(iframe);
    iframe.onload = function() {
        console.log(iframe.contentWindow....); // 在这里操作b.html里的元素数据
    }
 

b.html

document.domain = "a.com";

 

 

注意:document.domain需要设置成自身或更高一级的父域,且主域必须相同。


以上是关于PHP跨域上传的几种方法的主要内容,如果未能解决你的问题,请参考以下文章

关于跨域的几种方法

跨域的几种方法

跨域的几种方法及案例代码

关于跨域的处理的几种方法的整理

项目中经常遇到的跨域请求的几种方法

跨域的几种方法