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