讲师中心 微信公众号
AI工具推荐 视频效率加速

php-curl封装[避免下传文件二义性Bug]

阿杰大大_2423

阿杰大大_2423

发布时间:2016-06-13 10:48:34

|

906人浏览过

|

来源于php中文网

原创

php-curl封装[避免上传文件二义性Bug]

由于php的curl在curl_setopt($curl, curlopt_postfields, xxx)时, 当xxx为数组时, 如果值的第一个字符是@, 则认为是文件上传, 当同时需要上传文件, [email protected], 存在冲突. 因此, 在api_common.php中的post数据的设置进行了封装


CurlShip Directory Submission
CurlShip Directory Submission

向CurlShip提交产品,这是一个对机器人友好的SaaS目录。只需一条curl命令即可发布产品,支持OG标签抓取、带徽章的dofollow链接及层级升级。

下载

<?php/** * php-curl库封装 * author: selfimpr * blog: http://blog.csdn.net/lgg201 * mail: [email&#160;protected] */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);}#设置请求bodyfunction __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 < count($components) ) 		if ( !preg_match(HTTP_1XX_RESP, $components[$i]) ) break;	$headers		= $components[$i];	$body			= implode("\r\n\r\n", array_slice($components, $i + 1));	return array(		RESP_CODE	=> $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];}


相关文章

PHP速学教程(入门到精通)
PHP速学教程(入门到精通)

PHP怎么学习?PHP怎么入门?PHP在哪学?PHP怎么学才快?不用担心,这里为大家提供了PHP速学教程(入门到精通),有需要的小伙伴保存下载就能学习啦!

下载

相关标签:

本站声明:本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系admin@php.cn

热门AI工具

更多
豆包大模型

豆包大模型是一款由字节跳动推出的企业级大语言模型服务平台。

DeepSeek

DeepSeek是一款面向对话、写作、编程和推理场景的AI大模型工具。

Atoms
Atoms Hot

Atoms是一款AI智能体工具,第一支自动构建真实业务的 AI 团队。

VibeKnow
VibeKnow Hot

一款AI视频创作工具,主要用于全球首个AI知识视频创作平台,文档、文章、网页,一键生成视频,适合需要提升相关任务效率的用户。

UpDream
UpDream Hot

一款AI视频创作工具,主要用于哔哩哔哩推出的自研AI视频创作工具,适合需要提升相关任务效率的用户。

WorkBuddy

一款AI办公效率工具,主要用于腾讯云推出的AI原生桌面智能体工作台,适合需要提升相关任务效率的用户。

AionClaw
AionClaw Hot

AionClaw是一款面向办公、创作和编程任务的AI桌面智能体。

立刻MV
立刻MV Hot

立刻MV是一款AI文本写作工具,AI 音乐视频(MV)创作工具。

PixPix
PixPix Hot

PixPix是一款面向电商视觉生产的AI商品图生成工具。

相关专题

更多
Gradle插件开发入门教程
Gradle插件开发入门教程

本专题介绍Gradle插件开发的基本流程,涵盖插件类编写、自定义任务注册、扩展参数设计和插件应用方法,帮助你理解插件如何组织构建逻辑,减少多个项目之间的重复配置。

100

2026.10.22

Gradle Wrapper配置教程
Gradle Wrapper配置教程

本专题介绍Gradle Wrapper的基本作用,涵盖文件组成、生成方法、版本配置和任务调用,帮助你理解项目如何使用指定的Gradle版本,减少不同开发环境带来的构建差异。

60

2026.10.22

Golangci-lint检查器使用教程
Golangci-lint检查器使用教程

本专题整理Golangci-lint常用Linters的用途与配置方法,覆盖错误处理、无效代码、安全、复杂度、命名和依赖检查,帮助项目合理选规则。

60

2026.10.22

Gradle怎么构建Java项目
Gradle怎么构建Java项目

本专题介绍Gradle Java项目构建方法,涵盖Java插件配置、依赖声明、源码编译、测试执行和打包检查,帮助你理解各阶段的任务关系,逐步完成项目构建。

20

2026.10.22

PHP时间戳漏洞修复教程
PHP时间戳漏洞修复教程

本专题汇总PHP常见时间戳漏洞,包括2038年溢出、时区漂移、时间戳伪造、重放攻击、时间盲注与日志审计失效等,并给出升级64位环境、使用 DateTimeImmutable、统一UTC、严格超时校验、预处理绑定、hash_equals 比对等修复方案,帮助开发者快速排查和加固时间相关代码。

60

2026.10.22

Golangci-lint配置文件与规则设置
Golangci-lint配置文件与规则设置

本专题聚焦Golangci-lint YAML配置文件,讲清运行参数、规则启停、目录排除、问题过滤及严重级别设置,便于团队统一检查标准。

20

2026.10.22

Golangci-lint安装与入门教程
Golangci-lint安装与入门教程

本专题讲解Golangci-lint的安装、初始化、基础命令和首次代码检查,覆盖本地环境、Docker及多平台用法,帮助Go开发者快速上手。

40

2026.10.22

PHP2Shell高危漏洞修复教程
PHP2Shell高危漏洞修复教程

PHP2Shell漏洞是什么,哪些PHP版本和运行环境会受到影响,服务器应该如何检测与修复?本专题提供版本自查脚本、Linux与Docker升级命令、PHP-FPM和Apache排查步骤,以及修复验证、临时缓解和应急响应方案。

280

2026.10.22

剧云人物设定与关系管理教程
剧云人物设定与关系管理教程

本专题介绍剧云人物设定与关系管理,讲解角色小传、性格职业、人物目标、背景资料和关系网络的创建及维护方法。

40

2026.10.22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
PHP使用CURL抓取页面
PHP使用CURL抓取页面

共4课时 | 3.1万人学习

前端最全HTTP基础原理及应用
前端最全HTTP基础原理及应用

共12课时 | 2.1万人学习

Laravel 团队合作的 15 个技巧
Laravel 团队合作的 15 个技巧

共1课时 | 181人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn