日期:2014-05-17 浏览次数:20709 次
由于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