日期:2014-05-17 浏览次数:20618 次
由于php的curl在curl_setopt($curl, CURLOPT_POSTFIELDS, xxx)时, 当xxx为数组时, 如果值的第一个字符是@, 则认为是文件上传, 当同时需要上传文件, 也需要提交可能首字符为@的其他普通数据时, 存在冲突. 因此, 在api_common.php中的post数据的设置进行了封装
<?php /** * php-curl库封装 * author: selfimpr * blog: http://blog.csdn.net/lgg201 * mail: lgg860911@yahoo.com.cn */ define('API_CURL_UPLOAD_FILE', '__file'); #支持的请求方法 define('REQUEST_METHOD_GET', 'GET'); define('REQUEST_METHOD_POST', 'POST'); define('REQUEST_METHOD_HEAD', 'HEAD'); #请求行为 define('REQUEST_BEHAVIOR_ALLOW_REDIRECT', 'allow_redirect'); define('REQUEST_BEHAVIOR_MAX_REDIRECT', 'max_redirect'); define('REQUEST_BEHAVIOR_USER_AGENT', 'user_agent'); define('REQUEST_BEHAVIOR_AUTOREFERER', 'autoreferer'); define('REQUEST_BEHAVIOR_UPLOAD', 'upload'); define('REQUEST_BEHAVIOR_CONNECTTIMEOUT', 'connecttimeout'); define('REQUEST_BEHAVIOR_DNS_CACHE_TIMEOUT', 'dns_cache_timeout'); define('REQUEST_BEHAVIOR_TIMEOUT', 'timeout'); define('REQUEST_BEHAVIOR_ENCODING', 'encoding'); define('REQUEST_BEHAVIOR_ERROR_HANDLER', 'error_handler'); define('REQUEST_BEHAVIORS', 'behaviors'); $GLOBALS[REQUEST_BEHAVIORS] = array( REQUEST_BEHAVIOR_ALLOW_REDIRECT => TRUE, REQUEST_BEHAVIOR_MAX_REDIRECT => 5, REQUEST_BEHAVIOR_USER_AGENT => 'curl-lib', REQUEST_BEHAVIOR_AUTOREFERER => TRUE, REQUEST_BEHAVIOR_UPLOAD => FALSE, REQUEST_BEHAVIOR_CONNECTTIMEOUT => 3, REQUEST_BEHAVIOR_DNS_CACHE_TIMEOUT => 3600, REQUEST_BEHAVIOR_TIMEOUT => 3, REQUEST_BEHAVIOR_ENCODING => 'gzip', REQUEST_BEHAVIOR_ERROR_HANDLER => '__default_curl_error_handler', ); define('MULTIPART_FORM_DATA_HEAD_FMT', 'Content-Type: multipart/form-data; boundary=----------------------------%s'); define('MULTIPART_FORM_DATA_BODY_STRING', "------------------------------%s\r\nContent-Disposition: form-data; name=\"%s\"\r\n\r\n%s\r\n"); define('MULTIPART_FORM_DATA_BODY_FILE', "------------------------------%s\r\nContent-Disposition: form-data; name=\"%s\"; filename=\"%s\"\r\nContent-Type: application/octet-stream\r\n\r\n%s\r\n"); define('MULTIPART_FORM_DATA_BODY_END', "------------------------------%s--\r\n\r\n"); #响应键值 define('RESP_CODE', 'resp_code'); define('RESP_BODY', 'resp_body'); define('RESP_HEADER', 'resp_header'); #HTTP 1xx状态验证 define('HTTP_1XX_RESP', '/^HTTP\/1.[01] 1\d{2} \w+/'); #默认错误处理的错误消息 define('E_CURL_ERROR_FMT', 'curl "%s" error[%d]: %s'); #默认的curl错误处理 function __default_curl_error_handler($curl, $url, $errno, $errstr) { trigger_error(sprintf(E_CURL_ERROR_FMT, $url, $errno, $errstr), E_USER_ERROR); } #切换CURL请求方法 function __method_switch($curl, $method) { switch ( $method) { case REQUEST_METHOD_POST: __curl_setopt($curl, CURLOPT_POST, TRUE); break; case REQUEST_METHOD_HEAD: __curl_setopt($curl, CURLOPT_NOBODY, TRUE); break; case REQUEST_METHOD_GET: __curl_setopt($curl, CURLOPT_HTTPGET, TRUE); break; default: break; } } #设置默认头信息 function __default_header_set($curl) { __curl_setopt($curl, CURLOPT_RETURNTRANSFER, TRUE); __curl_setopt($curl, CURLOPT_HEADER, TRUE); __curl_setopt($curl, CURLOPT_FOLLOWLOCATION, (bool)curl_behavior(REQUEST_BEHAVIOR_ALLOW_REDIRECT)); __curl_setopt($curl, CURLOPT_MAXREDIRS, (int)curl_behavior(REQUEST_BEHAVIOR_MAX_REDIRECT)); __curl_setopt($curl, CURLOPT_USERAGENT, (string)curl_behavior(REQUEST_BEHAVIOR_USER_AGENT)); __curl_setopt($curl, CURLOPT_AUTOREFERER, (bool)c