牛骨文教育服务平台(让学习变的简单)
博文笔记

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

创建时间:2016-12-24 投稿人: 浏览次数:1308

今天想用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


声明:该文观点仅代表作者本人,牛骨文系教育信息发布平台,牛骨文仅提供信息存储空间服务。