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
标签没有跨域限制的特性,通过在src
的url
的参数上附加回调函数名字,然后服务器接收回调函数名字并返回一个包含数据的回调函数
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.html
的window.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.html
的url
上,在c.html
页面通过location.hash
获取数据后传到a.html
(这个例子是传到a.html
的hash
上,当然也可以传到其他地方)
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
CORS
是XMLHttpRequest Level 2
里规定的一种跨域方式。在支持这个方式的浏览器里,javascript
的写法和不跨域的ajax
写法一模一样,只要服务器需要设置Access-Control-Allow-Origin: *
6.document.domain
这种方式适用于主域相同,子域不同,比如http://www.a.com
和http://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跨域上传的几种方法的主要内容,如果未能解决你的问题,请参考以下文章