首页 > 编程技术 > php

PHP跨网域跨主机跨server上传文件实例教程

发布时间:2016-11-25 16:18

有时我们为了方便、安全、快速,会把上传的文件单独放一台主机用二级域名访问,但是PHP如何把上传的文件放到另外一台主机呢?这就要跨域跨主机上传了,现在我们用实例来告诉你如何实现。

如何跨网域跨主机跨server上传文件?一般最基本的上传方式是:

1.使用者把文件上传到 web server

2. web server 把上传的文件 利用 move_uploaded_file() 函式,将档案移到指定的文件夹内

但是,有时候我们需要把上传的档案放到另一台专门放文件的 file server,这时候,就无法利用 move_uploaded_file() 去搬移文件了,而需要利用 ftp 去传送文件至 file server,方法很简单...

直接看程式码:

 

 代码如下 复制代码

$file = $_FILES['file'];

$file_tmp = $file['tmp_name'];

$file_name = $file['name'];

if(is_uploaded_file($file_tmp)){ //确定user有"上传"文件

$file_ext = strrchr($file_name,'.'); //上传文件的副文件名

$file_name_new = date('YmdHis').$file_ext;

$host = '127.0.0.1';

$port = '21';

$user = 'admin';

$pass = '123456';

$link = ftp_connect($host,$port);

$login = ftp_login($link,$user,$pass);

ftp_chdir($link,'filedir'); //切换到要放文件的文件夹

if(ftp_put($link,$file_name_new,$file_tmp,FTP_BINARY)){

$msg = '上传成功';

}else{

$msg = '上传失败';

}

}else{

$msg = '上传失败';

}

ftp_close($link);

echo $msg;

 

本文我们来讲讲PHP 利用HTTP Status Codes 传递Ajax 成功或失败的状态,文章后面附有PHP实现和C#实例,希望本文对你有所帮助。

一般处理Ajax 回应时会传送的信息种类有:数据、成功信息、错误信息、失败信息以及处理状态,传递的信息种类并不一致,再加上除了数据之外,通常还希望能传递处理状态,这种情况大部分会选择是以JSON 的方式传递这两个信息,以下是常见的几种格式:

但以执行状态跟操作行为作一个归纳,可以区分以下几种传递结果:

{ code: 1, msg: "OK" } { success: true , result: "data" , errorMsg: "" } { status: 'success' , result: [], errorMsg: "" } //...

但以执行状态跟操作行为作一个归纳,可以区分以下几种回传结果:

数据操作 HTTP Method 成功 错误/失败

读取(Read) GET 数据 错误/失败信息

新增 (Create)  POST 成功信息 错误/失败信息
修改 (Update)
删除 (Delete)

从上面的归纳可以看出规律性,接着只要有方法可以传送处理的状态,以及能够区分数据的种类,其实就单纯很多,而HTTP Status Codes 就是用来传递HTTP 的处理状态,如果利用这个方式来传递自定义的处理状态,这样HTTP Content 就可以很单纯传递数据,让数据格式不受限于JSON,还可以使用其他格式(text, xml, html),而且XMLHttpRequest 本身就有处理HTTP Status Codes 的能力,而jQuery.ajax 也有提供error status 的处理,所以可以利用这个来定义状态的处理,在HTTP Status Codes 有几个已经定义状态,很适合用来传递处理状态的信息:

400Bad Request错误的请求适用在表单内容的错误,如必填栏位未填、Email 格式错误

403Forbidden没有权限,被禁止的适用在没有登录或权限不足

500Internal Server Error内部服务器错误适用在程序的错误

jQuery 接收信息的范例

 

 代码如下 复制代码
$.ajax({   
   type: "POST" ,   
   url: document.location,   
   success: function (data, textStatus, jqXHR) {   
       alert(data);   
   },   
   error: function (jqXHR, textStatus, errorThrown) {   
       alert(jqXHR.responseText);   
   }   
}); 

 

PHP 传递错误信息的范例

 

 代码如下 复制代码
if (php_sapi_name() == 'cgi' ){   
   header ( "Status: 400 Bad Request" );   
} else {   
   header ( "HTTP/1.0 400 Bad Request" );   
}   
exit ( "储存失败!!" );  

 

C# MVC 传递错误信息的范例

 

 代码如下 复制代码
Response.TrySkipIisCustomErrors = true ;   
Response.StatusCode = 400;   
return Content( "储存失败!!" );   

 

两地距离我们通常用到最多的就是调用百度地图的api来实现了,但有时我们并不需要这接口了只需要简单的处理一即可,这时可以利用php来实现,具体如下。

目前在做一个交友项目,需要知道两个用户之间的距离。百度了一下,操作如下:
我们最容易获取到用户地理位置的信息就是ip。
我们通过百度api获取用户经纬度,用ip获取经纬度api:

http://developer.baidu.com/map/index.php?title=webapi/ip-api

得到经纬两个用户经纬度之后就可以计算两用户之间的距离了。计算如下:

 代码如下 复制代码
/**
* @desc 根据两点间的经纬度计算距离
* @param float $lat 纬度值
* @param float $lng 经度值
*/
function getDistance($lat1, $lng1, $lat2, $lng2)
{
$earthRadius = 6367000; //approximate radius of earth in meters 
  
 
$lat1 = ($lat1 * pi() ) / 180;
$lng1 = ($lng1 * pi() ) / 180;
 
$lat2 = ($lat2 * pi() ) / 180;
$lng2 = ($lng2 * pi() ) / 180;
 
 
$calcLongitude = $lng2 - $lng1;
$calcLatitude = $lat2 - $lat1;
$stepOne = pow(sin($calcLatitude / 2), 2) + cos($lat1) * cos($lat2) * pow(sin($calcLongitude / 2), 2);
$stepTwo = 2 * asin(min(1, sqrt($stepOne)));
$calculatedDistance = $earthRadius * $stepTwo;
 
return round($calculatedDistance);
}

代码未经测试。测试后再更新本篇文章告知结果。

APNS(英文全称:Apple Push Notification Service),中文翻译为:苹果推送通知服务。[1] 该技术由苹果公司提供的APNS服务,下面来看一个比较完善的苹果推送通知服务的php服务器端公共类

前段时间开发的一套APNS推送平台效率很差,通过再次深入研究苹果的消息推送服务,总结了不少经验。同时也参考了网上一些技术blog的博文,重新完善了此前写过的一个PHP类,代码如下:

 代码如下 复制代码

<?php
/**
 * ApplePush 苹果消息推送公共类
 */
class ApplePush
{
   
    const STATUS_CODE_INTERNAL_ERROR = 999;
    const ERROR_RESPONSE_SIZE = 6;
    const ERROR_RESPONSE_COMMAND = 8;
   
    protected $_errorResponseMessages = array(
        0 => 'No errors encountered',
        1 => 'Processing error',
        2 => 'Missing device token',
        3 => 'Missing topic',
        4 => 'Missing payload',
        5 => 'Invalid token size',
        6 => 'Invalid topic size',
        7 => 'Invalid payload size',
        8 => 'Invalid token',
        self::STATUS_CODE_INTERNAL_ERROR => 'Internal error'
    );
   
    /**
     * APNS server url
     *
     * @var string
     */
    protected $apns_url = 'ssl://gateway.push.apple.com:2195'; //沙盒地址:ssl://gateway.sandbox.push.apple.com:2195
   
    /**
     * 推送数据
     *
     * @var string
     */
    private $payload_json;
   
    /**
     * 数据流对象
     *
     * @var mixed
     */
    private $fp;
   
    /**
     * 设置APNS地址
     *
     * @param string $url
     */
    
    public function setApnsUrl($url)
    {
        if (empty($url)) {
            return false;
        } else {
            $this->apns_url = $url;
        }
        return true;
    }
   
    /**
     * 设置推送的消息
     *
     * @param string $body
     */
    public function setBody($body)
    {
        if (empty($body)) {
            return false;
        } else {
            $this->payload_json = json_encode($body);
        }
        return true;
    }
   
    /**
     * Open 打开APNS服务器连接
     *
     * @param string $pem 证书
     * @param string $passphrase 证书密钥
     */
    public function open($pem, $passphrase)
    {
        if (empty($pem)) {
            return false;
        }
        if (empty($passphrase)) {
            return false;
        }
        $ctx = stream_context_create();
        stream_context_set_option($ctx, 'ssl', 'local_cert', $pem);
        stream_context_set_option($ctx, 'ssl', 'passphrase', $passphrase);
        $fp = stream_socket_client($this->apns_url, $err, $errstr, 60, STREAM_CLIENT_CONNECT, $ctx);
        if (!$fp) {
            return false;
        }
        $this->fp = $fp;
        return true;
    }
   
    /**
     * Send 推送
     *
     * @param string $token
     */
    public function send($token, $id)
    {
        $msg = pack('CNNnH*', 1, $id, 864000, 32, $token) . pack('n', strlen($this->payload_json)) . $this->payload_json;
        // Send it to the server
        $result = fwrite($this->fp, $msg, strlen($msg));
        return $result;
    }
   
    public function readErrMsg()
    {
        $errInfo = @fread($this->fp, self::ERROR_RESPONSE_SIZE);
        if ($errInfo === false || strlen($errInfo) != self::ERROR_RESPONSE_SIZE) {
            return true;
        }
        $errInfo = $this->parseErrMsg($errInfo);
        if (!is_array($errInfo) || empty($errInfo)) {
            return true;
        }
        if (!isset($errInfo['command'], $errInfo['statusCode'], $errInfo['identifier'])) {
            return true;
        }
        if ($errInfo['command'] != self::ERROR_RESPONSE_COMMAND) {
            return true;
        }
        $errInfo['timeline'] = time();
        $errInfo['statusMessage'] = 'None (unknown)';
        $errInfo['errorIdentifier'] = $errInfo['identifier'];
        if (isset($this->_aErrorResponseMessages[$errInfo['statusCode']])) {
            $errInfo['statusMessage'] = $this->_errorResponseMessages[$errInfo['statusCode']];
        }
        return $errInfo;
    }

    protected function parseErrMsg($errorMessage)
    {
        return unpack('Ccommand/CstatusCode/Nidentifier', $errorMessage);
    }
   
    /**
     * Close APNS server 关闭APNS服务器连接
     *
     */
    public function close()
    {
        // Close the connection to the server
        fclose($this->fp);
        return true;
    }
}
?>

HttpClient.class.php类是一个国外网站提供一个非常好用的HttpClient.class.php类了,我们可以利用它来做很多的事情,下面来看看

通过HTTP协议客户端类HttpClient来介绍PHP POST HTTP请求的方法,这个类你可以到官方http://scripts.incutio.com/httpclient/index.php下载也可以通过本站下载点击下载附件

下载好后通过两个文件来测试下,新建一个PHP文件加入如下内容:

 代码如下 复制代码

<?php
     include_once('HttpClient.class.php');
     //目标主机的地址,我这里填上测试的地址
     $Client = new HttpClient("192.168.1.5");
     $url = "http://localhost/receive.php";//请求的页面地址
     //POST的参数
     $params = array('username'=>"guowenlong",'password'=>"hahahaha");
     $pageContents = HttpClient::quickPost($url, $params);
     echo $pageContents;
?>

上面代码第5行中的请求页面地址是receive.php所以再建一个receive.php文件,写入如下内容:

 代码如下 复制代码

<?php
    echo "username:".$_POST['username']."<br/>";
    echo "password:".$_POST['password']."<br/>";
?>

 

执行你建的第一个PHP文件将看到如下内容: username:guowenlong password:hahahaha

标签:[!--infotagslink--]

您可能感兴趣的文章: