curl实现文件上传
<?php
function makeCurlFile($file){
$mime = mime_content_type($file);
//var_dump($mime);
$info = pathinfo($file);
$name = $info['basename'];
//var_dump($name);
$output = new CURLFile($file, $mime, $name);
return $output;
}
$ch = curl_init("http://172.28.66.198/test/curlupload.php");
$mp3 =makeCurlFile('./music.aac');
$photo = makeCurlFile('./music.jpg');
$data = array('mp3' => $mp3, 'picture' => $photo, 'name' => 'My latest single', 'description' => 'Check out my newest song');
curl_setopt($ch, CURLOPT_POST,1);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
if (curl_errno($ch)) {
$result = curl_error($ch);
}
var_dump($result);
curl_close ($ch);curl版本化:
<=5.4 curl上传文件只支持@语法
= 5.5 支持@语法和CURLFile类
大于=5.6 只支持CURLFile类
$curl = curl_init();
if (class_exists('\CURLFile')) {// 这里用特性检测判断php版本
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, true);
$data = array('file' => new \CURLFile(realpath($source)));//>=5.5
} else {
if (defined('CURLOPT_SAFE_UPLOAD')) {
curl_setopt($curl, CURLOPT_SAFE_UPLOAD, false);
}
$data = array('file' => '@' . realpath($source));//<=5.5
}
curl_setopt($curl, CURLOPT_URL, $url);
curl_setopt($curl, CURLOPT_POST, 1 );
curl_setopt($curl, CURLOPT_POSTFIELDS, $data);
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_USERAGENT,"TEST");
$result = curl_exec($curl);
$error = curl_error($curl);curlupload.php
<?php print_r($_POST); print_r($_FILES);
看执行结果:
D:\phpStudy\WWW\test\curl_uploadfile.php:5: string(9) "video/mp4" D:\phpStudy\WWW\test\curl_uploadfile.php:8: string(9) "music.aac" D:\phpStudy\WWW\test\curl_uploadfile.php:5: string(10) "image/jpeg" D:\phpStudy\WWW\test\curl_uploadfile.php:8: string(9) "music.jpg" Array ( [name] => My latest single [description] => Check out my newest song ) #把两个文件都已经上传上来了 Array ( [mp3] => Array ( [name] => music.aac [type] => video/mp4 [tmp_name] => C:\Windows\php9E46.tmp [error] => 0 [size] => 1776415 ) [picture] => Array ( [name] => music.jpg [type] => image/jpeg [tmp_name] => C:\Windows\php9E86.tmp [error] => 0 [size] => 133140 ) )
有了$_FILES这个属性,我们就可以通过 move_upload_file 进行上传了。
第二种:
curl采用base64的方式进行上传
$ch = curl_init("http://172.28.66.198/test/curluploadsave.php");
$path=__DIR__;
// $data = array('img'=>'@'.$path.DIRECTORY_SEPARATOR.'music.jpg');
$data = array('img'=>base64_encode(file_get_contents($path.DIRECTORY_SEPARATOR.'music.jpg')));
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
curl_setopt($ch, CURLOPT_POST,true);
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
$result = curl_exec($ch);
if (curl_errno($ch)) {
$result = curl_error($ch);
}
curl_close ($ch);
print_r($result);curluploadsave.php
<?php
file_put_contents('test.jpg',base64_decode($_POST['img']));这样也是可以进行上传的。
还有一种方式就是通过ftp进行上传:
<?php $localfile = "music.jpg"; $fp = fopen ($localfile, "r"); $arr_ip = '172.28.66.194'; $ftp = "ftp://".$arr_ip."/vftp/".$localfile; $ch = curl_init(); curl_setopt($ch, CURLOPT_VERBOSE, 1); curl_setopt($ch, CURLOPT_USERPWD, 'ftp_test:song654321'); curl_setopt($ch, CURLOPT_URL, $ftp); curl_setopt($ch, CURLOPT_PUT, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_INFILE, $fp); curl_setopt($ch, CURLOPT_INFILESIZE, filesize($localfile)); $http_result = curl_exec($ch); $error = curl_error($ch); var_dump($error)."<br>"; $http_code = curl_getinfo($ch ,CURLINFO_HTTP_CODE); curl_close($ch); fclose($fp); var_dump($http_result);
执行过程:
* Trying 172.28.66.194... * Connected to 172.28.66.194 (172.28.66.194) port 21 (#0) < 220 (vsFTPd 2.2.2) > USER ftp_test < 331 Please specify the password. > PASS song654321 < 230 Login successful. > PWD < 257 "/" * Entry path is '/' > CWD vftp * ftp_perform ends with SECONDARY: 0 < 250 Directory successfully changed. > EPSV * Connect data stream passively < 229 Entering Extended Passive Mode (|||58536|). * Trying 172.28.66.194... * Connecting to 172.28.66.194 (172.28.66.194) port 58536 * Connected to 172.28.66.194 (172.28.66.194) port 21 (#0) > TYPE I < 200 Switching to Binary mode. > STOR music.jpg < 150 Ok to send data. * We are completely uploaded and fine * Remembering we are in dir "vftp/" < 226 Transfer complete. * Connection #0 to host 172.28.66.194 left intact D:\phpStudy\WWW\test\curl_ftpupload.php:18: string(0) "" D:\phpStudy\WWW\test\curl_ftpupload.php:23: string(0) "" [Finished in 0.2s]
