php如何CURL 上传文件到其他服务器

今天想用php curl上传文件到别的服务器,百度了下找到一个方法,


$ch = curl_init();

$data = array('name' => 'Foo', 'file' => '@/home/vagrant/test.png');

curl_setopt($ch, CURLOPT_URL, 'http://localhost/test/curl/load_file.php');
curl_setopt($ch, CURLOPT_POST, 1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);

curl_exec($ch);
但是这种方法死活不行,找了半天才发现这种方法自php5.5之后就已经废弃了。


 从 PHP 5.5.0 开始, @ 前缀已被废弃,文件可通过 CURLFile 发送。 设置 CURLOPT_SAFE_UPLOAD 为 TRUE 可禁用 @ 前缀发送文件,以增加安全性。

遂使用 CURLFile 类得以解决。


具体实现代码如下(我封装了一个方法来实现):


/**
 * 上传头像
 */
function uploadFace(){
    $file = request()->file('file')->getInfo();
    if($file){
        $upload = array(
            'get_name'  => 'file',
            'type'  =>  $file['type'],
            'name'  =>  $file['name'],
            'file'  =>  $file['tmp_name'],
        );
        exit(json_encode($this->connect('user/face',
            array('username'  => input('username')), 'POST', $upload)));
    }else{
        $this->dump('上传图片失败#1');
    }
}


/**
 * 请求数据
 * @param $action
 * @param array $params
 * @param string $type
 * @param $upload
 * @return mixed
 */
protected function connect($action, $params = array(), $type = 'POST', $upload = false){
    $data = array();
    $method = strtoupper($type);
    $url = $this->api_url . $action;
    $params['api_key'] = $this->api_key;
    if($method == 'GET'){
        $url = "{$url}?" . http_build_query($params);
    }
    $ch = curl_init();
    curl_setopt($ch, CURLOPT_URL, $url);
    curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1);
    curl_setopt($ch, CURLOPT_CUSTOMREQUEST, $method);
    if($method == 'POST'){
        if($upload){        //设置上传文件
            $file = new \CURLFile($upload['file'], $upload['type'], $upload['name']);
            $params[$upload['get_name']] = $file;
        }
        curl_setopt($ch, CURLOPT_POSTFIELDS, $params);
    }
    $result = curl_exec($ch);
    curl_close($ch);
    if($data === null){
        $this->dump('请求数据失败.', 2);
    }else{
        try{
            $data = json_decode($result, true);
        }catch(\Exception $e){
            $this->dump('parse error.', 2, $e);
        }
    }
    return $data;
}


参考文献: 
http://php.net/manual/zh/class.curlfile.php


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值