<?php /** * Email net.webjoy@gmail.com * author jackluo * 2014.11.21 * */ //* function curl_post($url, $data, $header = array()){ if(function_exists('curl_init')) { $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); if(is_array($header) && !empty($header)){ $set_head = array(); foreach ($header as $k=>$v){ $set_head[] = "$k:$v"; } curl_setopt($ch, CURLOPT_HTTPHEADER, $set_head); } curl_setopt($ch, CURLOPT_HEADER, 0); curl_setopt($ch, CURLOPT_POST, 1); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_TIMEOUT, 1);// 1s to timeout. $response = curl_exec($ch); if(curl_errno($ch)){ //error return curl_error($ch); } $reslut = curl_getinfo($ch); print_r($reslut); curl_close($ch); $info = array(); if($response){ $info = json_decode($response, true); } return $info; } else { throw new Exception('Do not support CURL function.'); } } //*/ // function api_notice_increment($url, $data) { $ch = curl_init(); curl_setopt($ch, CURLOPT_HEADER,0); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, 1); // $data = http_build_query($data); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); //curl_file_create // $result = curl_exec($ch); $lst['rst'] = curl_exec($ch); $lst['info'] = curl_getinfo($ch); curl_close($ch); return $lst; // return $result; } /** * curl文件上傳 * @var struing $r_file 上傳文件的路勁和文件名 * */ /* function upload_file($url,$r_file) { $file = array("fax_file"=>'@'.$r_file,'type'=>'image/jpeg');//文件路徑,前面要加@,表明是文件上傳. $curl = curl_init(); curl_setopt($curl, CURLOPT_URL,$url); curl_setopt($curl,CURLOPT_POST,1); curl_setopt($curl,CURLOPT_POSTFIELDS,$file); curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1); curl_setopt($curl, CURLOPT_HEADER, 0); $result = curl_exec($curl); //$result 獲取頁面信息 curl_close($curl); echo $result ; //輸出 頁面結果 }*/ function upload_file($url,$filename,$path,$type){ $data = array( 'pic'=>'@'.realpath($path).";type=".$type.";filename=".$filename ); $ch = curl_init(); //設置帳號和帳號名 curl_setopt($ch, CURLOPT_USERPWD, 'joe:secret' ); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true ); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_getinfo($ch); $return_data = curl_exec($ch); curl_close($ch); echo $return_data; } // php 5.5 以后請用以下函數 function upload_file($url,$filename,$path,$type){ $data = array( 'pic'=>new CURLFile(realpath($path)) ); $ch = curl_init(); //也可以用以下注釋掉的不用改代碼,覺得新版的可以省下點代碼,看個人 //curl_setopt($ch, CURLOPT_SAFE_UPLOAD, false); //設置帳號和帳號名 curl_setopt($ch, CURLOPT_USERPWD, 'joe:secret' ); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true ); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_getinfo($ch); $return_data = curl_exec($ch); curl_close($ch); echo $return_data; } if ($_POST) { $url = 'http://platform.com/upload/image'; // $path = $_SERVER['DOCUMENT_ROOT']; /* print_r($_FILES); exit; */ //$filename = $path."/232.jpg"; //upload tmp $tmpname = $_FILES['fname']['name']; $tmpfile = $_FILES['fname']['tmp_name']; $tmpType = $_FILES['fname']['type']; // echo $tmpType; upload_file($url,$tmpname,$tmpfile,$tmpType); /* $data = array( 'path'=>"@$path/232.jpg", 'name'=>'h' ); */ //'pic'=>'@/tmp/tmp.jpg', 'filename'=>'tmp' //$data = array('pic'=>"@$filename", 'filename'=>'tmp'); /* $data = array( 'uid' => 10086, 'pic' => '@$tmpfile'.';type='.$tmpType ); $info = api_notice_increment($url, $data); */ //$info = curl_post($url, $data); //$info = api_notice_increment($url, $data); //upload_file($url,$tmpfile); //print_r($info); exit; /* $file = 'H:\www\test\psuCARGLSPA-pola.jpg'; //要上傳的文件 $src = upload_curl_pic($file); echo $src; */ } ?> <form action="http://localhost/upload.php" enctype="multipart/form-data" method="post"> <p>UpLoad: <input type="text" name="fname" /></p> <p>UpLoad: <input type="file" name="fname" /></p> <input type="submit" value="Submit" /> </form>
以下是網上看到的另外的代碼
最近需要用http模擬表單提交,簡單的數據提交倒是簡單,如果要上傳圖片就要稍微做些變動了。下面分享一下,利用curl和fsockopen兩種方法實現,我測試通過的例子。
發送請求的頁面:fsocketupload.PHP
<?php /** * @author zhao jinhan * @email: xb_zjh@126.com * @url : www.icode100.com * @date : 2014年1月18日13:09:42 * */ header('Content-type:text/html; charset=utf-8'); //聲明編碼 //模擬POST上傳圖片和數據 //第一種方法:CURL $ch = curl_init(); $url = 'http://www.test.localhost/fsocketget.php'; $curlPost = array('sid'=>1,'file'=>'@D:/xampp/htdocs/www/www.test.localhost/images/adding.gif'); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_HEADER, 1); curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); curl_setopt($ch, CURLOPT_POST, 1); //POST提交 curl_setopt($ch, CURLOPT_POSTFIELDS,$curlPost); $data =curl_exec($ch); curl_close($ch); echo '<pre>'; var_dump($data); //第二種方法:fsockopen方法上傳 $arr_data = array('sid'=>1,'mid'=>2); //普通參數 $var_file='image'; //文件變量名 $file_type='image/jpeg'; //文件類型 $filepath = 'D:/xampp/htdocs/www/www.test.localhost/images/2.jpg'; //文件路徑 $filestring = @file_get_contents($filepath) or exit('not found file ( '.$filepath.' )'); //生成文件流 $host = 'www.test.localhost'; //構造post請求的頭 $boundary = substr(md5(time()),8,16); //分隔符 $header = "POST /fsocketget.php HTTP/1.1\r\n";//一般有post, get這兩種 $header .= "Host: {$host}\r\n"; $header .= "Content-Type: multipart/form-data; boundary={$boundary}\r\n"; $data = ""; //請求普通數據 foreach($arr_data as $k=>$v){ $data .= "--{$boundary}\r\n"; $data .= "Content-Disposition: form-data; name=\"{$k}\"\r\n"; $data .= "\r\n{$v}\r\n"; $data .= "--{$boundary}\r\n"; } //請求圖片數據 $filename = basename($filepath); //文件名 $data .= "--{$boundary}\r\n"; $data .= "Content-Disposition: form-data; name=\"$var_file\"; filename=\"$filename\"\r\n"; $data .= "Content-Type: $file_type\r\n"; //\r\n不可少 $data .= "\r\n$filestring\r\n"; //\r\n不可少 $data .= "--{$boundary}\r\n"; //\r\n不可少 $header .= "Content-Length: ".strlen($data)."\r\n\r\n"; //\r\n不可少 //發送post的數據 $fp = fsockopen($host,80,$errno,$errstr,10) or exit($errstr."--->".$errno); fputs($fp,$header.$data); $inheader = 0; //1去除請求包的頭只顯示頁面的返回數據 0-保留頭 while (!feof($fp)) { $line = fgets($fp,1024); if ($inheader && ($line == "\n" || $line == "\r\n")) { $inheader = 0; } if ($inheader == 0) { echo $line; } } fclose($fp);
請求api頁面:fsocketget.php
<?php /* 接收請求的API */ if($_POST){ echo '<pre>'; print_r($_POST); print_r($_FILES); }else{ echo 'error'; }