php-curl封装[避免下传文件二义性Bug]
php-curl封装[避免上传文件二义性Bug]
由于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)curl_behavior(REQUEST_BEHAVIOR_AUTOREFERER)); __curl_setopt($curl, CURLOPT_UPLOAD, (bool)curl_behavior(REQUEST_BEHAVIOR_UPLOAD)); __curl_setopt($curl, CURLOPT_CONNECTTIMEOUT, (int)curl_behavior(REQUEST_BEHAVIOR_CONNECTTIMEOUT)); __curl_setopt($curl, CURLOPT_DNS_CACHE_TIMEOUT, (int)curl_behavior(REQUEST_BEHAVIOR_DNS_CACHE_TIMEOUT)); __curl_setopt($curl, CURLOPT_TIMEOUT, (int)curl_behavior(REQUEST_BEHAVIOR_TIMEOUT)); __curl_setopt($curl, CURLOPT_ENCODING, (string)curl_behavior(REQUEST_BEHAVIOR_ENCODING)); } #设置用户自定义头信息 function __custom_header_set($curl, $headers = NULL) { if ( empty($headers) ) return ; if ( is_string($headers) ) $headers = explode("\r\n", $headers); #类型修复 foreach ( $headers as &$header ) if ( is_array($header) ) $header = sprintf('%s: %s', $header[0], $header[1]); __curl_setopt($curl, CURLOPT_HTTPHEADER, $headers); } #设置请求body function __datas_set($curl, $datas = NULL) { if ( empty($datas) ) return ; if ( is_array($datas) ) { $custom_body = FALSE; $uniqid = uniqid(); $custom_body_str = ''; foreach ( $datas as $name => $data ) { if ( is_array($data) && array_key_exists(API_CURL_UPLOAD_FILE, $data) ) { $file = $data[API_CURL_UPLOAD_FILE]; if ( file_exists($file) ) { $custom_body = TRUE; $custom_body_str .= sprintf(MULTIPART_FORM_DATA_BODY_FILE, $uniqid, $name, $file, file_get_contents($file)); } } else { $custom_body_str .= sprintf(MULTIPART_FORM_DATA_BODY_STRING, $uniqid, $name, $data); } } if ( $custom_body ) { curl_setopt($curl, CURLOPT_HTTPHEADER, array(sprintf(MULTIPART_FORM_DATA_HEAD_FMT, $uniqid))); $datas = $custom_body_str . sprintf(MULTIPART_FORM_DATA_BODY_END, $uniqid); } } __curl_setopt($curl, CURLOPT_POSTFIELDS, $datas); } #对curl_setopt的封装 function __curl_setopt($curl, $optname, $optval) { curl_setopt($curl, $optname, $optval); __curl_error($curl); } #curl错误检查处理 function __curl_error($curl) { if ( curl_errno($curl) ) { $url = curl_getinfo($curl, CURLINFO_EFFECTIVE_URL); $errno = curl_errno($curl); $errstr = curl_error($curl); $errh = curl_behavior(REQUEST_BEHAVIOR_ERROR_HANDLER); if ( function_exists($errh) ) $errh($curl, $url, $errno, $errstr); } } #api默认行为切换 function curl_behavior($names, $values = NULL) { if ( !is_string($names) && !is_array($names) ) return ; if ( !is_null($values) ) { if ( is_string($names) ) $GLOBALS[REQUEST_BEHAVIORS][$names] = $values; else if ( is_array($names) && !is_array($values) ) foreach ( $names as $name ) $GLOBALS[REQUEST_BEHAVIORS][$name] = $values; else if ( is_array($names) && is_array($values) ) foreach ( $names as $k => $name ) $GLOBALS[REQUEST_BEHAVIORS][$name] = $values[$k]; } if ( is_string($names) ) { $return = $GLOBALS[REQUEST_BEHAVIORS][$names]; } else if ( is_array($names) ) { $return = array(); foreach ( $names as $name ) $return[$name] = array_key_exists($name, $GLOBALS[REQUEST_BEHAVIORS]) ? $GLOBALS[REQUEST_BEHAVIORS][$name] : NULL; } return $return; } #请求入口 function curl_request($url, $method, $datas = NULL, $headers = NULL) { $curl = curl_init($url); __method_switch($curl, $method); __default_header_set($curl); __custom_header_set($curl, $headers); __datas_set($curl, $datas); $response = curl_exec($curl); __curl_error($curl); $status_code = curl_getinfo($curl, CURLINFO_HTTP_CODE); $components = explode("\r\n\r\n", $response); $i = -1; while ( ++ $i $status_code, RESP_HEADER => $headers, RESP_BODY => $body, ); } #GET请求 function curl_get($url, $headers = NULL) { return curl_request($url, REQUEST_METHOD_GET, NULL, $headers); } #POST请求 function curl_post($url, $datas = NULL, $headers = NULL) { return curl_request($url, REQUEST_METHOD_POST, $datas, $headers); } #HEAD请求 function curl_head($url, $headers = NULL) { return curl_request($url, REQUEST_METHOD_HEAD, NULL, $headers); } #构造上传文件字段 function curl_post_file($file) { return array( API_CURL_UPLOAD_FILE => $file, ); } #读取响应码 function curl_resp_code($resp) { return $resp[RESP_CODE]; } #读取响应头 function curl_resp_header($resp) { return $resp[RESP_HEADER]; } #读取响应体 function curl_resp_body($resp) { return $resp[RESP_BODY]; }

热AI工具

Undresser.AI Undress
人工智能驱动的应用程序,用于创建逼真的裸体照片

AI Clothes Remover
用于从照片中去除衣服的在线人工智能工具。

Undress AI Tool
免费脱衣服图片

Clothoff.io
AI脱衣机

Video Face Swap
使用我们完全免费的人工智能换脸工具轻松在任何视频中换脸!

热门文章

热工具

记事本++7.3.1
好用且免费的代码编辑器

SublimeText3汉化版
中文版,非常好用

禅工作室 13.0.1
功能强大的PHP集成开发环境

Dreamweaver CS6
视觉化网页开发工具

SublimeText3 Mac版
神级代码编辑软件(SublimeText3)

curl和Pythonrequests都是发送HTTP请求的强大工具。虽然curl是一种命令行工具,可让您直接从终端发送请求,但Python的请求库提供了一种更具编程性的方式来从Python代码中发送请求。将curl转换为Pythonrequestscurl命令的基本语法如下所示:curl[OPTIONS]URL将curl命令转换为Python请求时,我们需要将选项和URL转换为Python代码。这是一个示例curlPOST命令:curl-XPOSThttps://example.com/api

从头到尾:如何使用php扩展cURL进行HTTP请求引言:在Web开发中,经常需要与第三方API或其他远程服务器进行通信。而使用cURL进行HTTP请求是一种常见而强大的方式。本文将介绍如何使用php扩展cURL来执行HTTP请求,并提供一些实用的代码示例。一、准备工作首先,确保php已安装cURL扩展。可以在命令行执行php-m|grepcurl查

在Linux下更新curl版本,您可以按照以下步骤进行操作:检查当前curl版本:首先,您需要确定当前系统中安装的curl版本。打开终端,并执行以下命令:curl--version该命令将显示当前curl的版本信息。确认可用的curl版本:在更新curl之前,您需要确定可用的最新版本。您可以访问curl的官方网站(curl.haxx.se)或相关的软件源,查找最新版本的curl。下载curl源代码:使用curl或浏览器,下载您选择的curl版本的源代码文件(通常为.tar.gz或.tar.bz2

PHP8.1发布:引入curl多个请求并发处理近日,PHP官方发布了最新版本的PHP8.1,其中引入了一个重要的特性:curl多个请求并发处理。这个新特性为开发者提供了一个更加高效和灵活的方式来处理多个HTTP请求,极大地提升了性能和用户体验。在以往的版本中,处理多个请求往往需要通过创建多个curl资源,并使用循环来分别发送和接收数据。这种方式虽然能够实现目

PHPCurl中如何处理网页的301重定向?在使用PHPCurl发送网络请求时,时常会遇到网页返回的301状态码,表示页面被永久重定向。为了正确处理这种情况,我们需要在Curl请求中添加一些特定的选项和处理逻辑。下面将详细介绍在PHPCurl中如何处理网页的301重定向,并提供具体的代码示例。301重定向处理原理301重定向是指服务器返回了一个30

define定义多行宏可以通过使用 `\` 将 `do { \ printf("%d\n", x); \ } while (0)` 分成了多行进行定义。在宏定义中,反斜杠 `\` 必须是宏定义的最后一个字符,且不能有空格或注释跟随。使用 `\` 进行续行时,注意保持代码的可读性,并确保每个行末都有 `\`。

request的中文意思为“请求”,是php中的一个全局变量,是一个包含了“$_POST”、“$_GET”和“$_COOKIE”的数组。“$_REQUEST”变量可以获取POST或GET方式提交的数据、COOKIE信息。

在linux中,curl是一个非常实用的、用来与服务器之间传输数据的工具,是一个利用URL规则在命令行下工作的文件传输工具;它支持文件的上传和下载,是综合传输工具。curl提供了一大堆非常有用的功能,包括代理访问、用户认证、ftp上传下载、HTTP POST、SSL连接、cookie支持、断点续传等等。
