php实现支持get,post,multipart/form-data的http请求类,multipartform-data本文实例讲述了php实现支持get,post,multipart/form-data的http请求类及其应用,分享给大家供大家参考。具体如下:
httprequest.class.php类文件如下:
_ip = isset($config['ip'])? $config['ip'] : '';     $this->_host = isset($config['host'])? $config['host'] : '';     $this->_url = isset($config['url'])? $config['url'] : '';     $this->_port = isset($config['port'])? $config['port'] : '';     $this->_errno = isset($config['errno'])? $config['errno'] : '';     $this->_errstr = isset($config['errstr'])? $config['errstr'] : '';     $this->_timeout = isset($confg['timeout'])? $confg['timeout'] : 15;      // 如没有设置ip,则用host代替     if($this->_ip==''){       $this->_ip = $this->_host;     }   }    // 设置表单数据   public function setformdata($formdata=array()){     $this->_formdata = $formdata;   }    // 设置文件数据   public function setfiledata($filedata=array()){     $this->_filedata = $filedata;   }    // 发送数据   public function send($type='get'){      $type = strtolower($type);      // 检查发送类型     if(!in_array($type, array('get','post','multipart'))){       return false;     }      // 检查连接     if($this->connect()){        switch($type){         case 'get':           $out = $this->sendget();           break;          case 'post':           $out = $this->sendpost();           break;          case 'multipart':           $out = $this->sendmultipart();           break;       }        // 空数据       if(!$out){         return false;       }        // 发送数据       fputs($this->_fp, $out);        // 读取返回数据       $response = '';        while($row = fread($this->_fp, 4096)){         $response .= $row;       }        // 断开连接       $this->disconnect();        $pos = strpos($response, \r\n\r\n);       $response = substr($response, $pos+4);        return $response;      }else{       return false;     }   }    // 创建连接   private function connect(){     $this->_fp = fsockopen($this->_ip, $this->_port, $this->_errno, $this->_errstr, $this->_timeout);     if(!$this->_fp){       return false;     }     return true;   }    // 断开连接   private function disconnect(){     if($this->_fp!=null){       fclose($this->_fp);       $this->_fp = null;     }   }    // get 方式,处理发送的数据,不会处理文件数据   private function sendget(){      // 检查是否空数据     if(!$this->_formdata){       return false;     }      // 处理url     $url = $this->_url.'?'.http_build_query($this->_formdata);          $out = get .$url. http/1.1\r\n;     $out .= host: .$this->_host.\r\n;     $out .= connection: close\r\n\r\n;      return $out;   }    // post 方式,处理发送的数据   private function sendpost(){      // 检查是否空数据     if(!$this->_formdata && !$this->_filedata){       return false;     }      // form data     $data = $this->_formdata? $this->_formdata : array();      // file data     if($this->_filedata){       foreach($this->_filedata as $filedata){         if(file_exists($filedata['path'])){           $data[$filedata['name']] = file_get_contents($filedata['path']);         }       }     }      if(!$data){       return false;     }      $data = http_build_query($data);      $out = post .$this->_url. http/1.1\r\n;     $out .= host: .$this->_host.\r\n;     $out .= content-type: application/x-www-form-urlencoded\r\n;     $out .= content-length: .strlen($data).\r\n;     $out .= connection: close\r\n\r\n;     $out .= $data;      return $out;   }    // multipart 方式,处理发送的数据,发送文件推荐使用此方式   private function sendmultipart(){      // 检查是否空数据     if(!$this->_formdata && !$this->_filedata){       return false;     }      // 设置分割标识     srand((double)microtime()*1000000);     $boundary = '---------------------------'.substr(md5(rand(0,32000)),0,10);      $data = '--'.$boundary.\r\n;      // form data     $formdata = '';      foreach($this->_formdata as $key=>$val){       $formdata .= content-disposition: form-data; name=\.$key.\\r\n;       $formdata .= content-type: text/plain\r\n\r\n;       if(is_array($val)){         $formdata .= json_encode($val).\r\n; // 数组使用json encode后方便处理       }else{         $formdata .= rawurlencode($val).\r\n;       }       $formdata .= '--'.$boundary.\r\n;     }      // file data     $filedata = '';      foreach($this->_filedata as $val){       if(file_exists($val['path'])){         $filedata .= content-disposition: form-data; name=\.$val['name'].\; filename=\.$val['filename'].\\r\n;         $filedata .= content-type: .mime_content_type($val['path']).\r\n\r\n;         $filedata .= implode('', file($val['path'])).\r\n;         $filedata .= '--'.$boundary.\r\n;       }     }      if(!$formdata && !$filedata){       return false;     }      $data .= $formdata.$filedata.--\r\n\r\n;      $out = post .$this->_url. http/1.1\r\n;     $out .= host: .$this->_host.\r\n;     $out .= content-type: multipart/form-data; boundary=.$boundary.\r\n;     $out .= content-length: .strlen($data).\r\n;     $out .= connection: close\r\n\r\n;     $out .= $data;      return $out;   } } // class end  ?>
demo示例程序如下:
 'demo.fdipzone.com', // 如空则用host代替       'host' => 'demo.fdipzone.com',       'port' => 80,       'errno' => '',       'errstr' => '',       'timeout' => 30,       'url' => '/getapi.php',       //'url' => '/postapi.php',       //'url' => '/multipart.php' );  $formdata = array(   'name' => 'fdipzone',   'gender' => 'man' );  $filedata = array(   array(     'name' => 'photo',     'filename' => 'photo.jpg',     'path' => 'photo.jpg'   ) );  $obj = new httprequest(); $obj->setconfig($config); $obj->setformdata($formdata); $obj->setfiledata($filedata); $result = $obj->send('get'); //$result = $obj->send('post'); //$result = $obj->send('multipart');  echo ''; print_r($result); echo '
';  ?> 
完整实例代码可以点击此处本站下载。
希望本文所述对大家的php程序设计有所帮助。
【急】对于php中文件上传 post传值问题 不确定是enctype=multipart/form-data属性问题还是版本问题
文件上传类型为file的控件,后台获取时只能用$_files来获取,其他的控件类型才是用$_post来获取,你只需要用$_files获取的值来进行你的处理。
js 模拟post提交enctype=multipart/form-data类型的表单
只是需要文件上传才用它的
xmlhttp.setrequestheader(content-type,application/x-www-form-urlencoded;);
改成
xmlhttp.setrequestheader(content-type,multipart/form-data;);
至于发送二进制数据,你自己解决吧。
-----------------------------7db8c30150364  这个其实有规律的
就是一个开始段一个结束段,7db8c30150364  只是用一串不重复的字符,标识一起其中间的东西就是数据,content-disposition: form-data; name=polls[] 这个是用来表示什么数据,文件名是啥。
其实在socket发包中,上传文件的时候就要这么用,有空研究一下http里面post 文件时,应该如何处理。
http://www.bkjia.com/phpjc/883686.htmlwww.bkjia.comtruehttp://www.bkjia.com/phpjc/883686.htmltecharticlephp实现支持get,post,multipart/form-data的http请求类,multipartform-data 本文实例讲述了php实现支持get,post,multipart/form-data的http请求类及其应用,分享...
   
 
   