淘宝SDK扒出来的CURL调用含文件上传代码
<?php
function curl($url,$postFields=null){
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL,$url);
curl_setopt($ch,CURLOPT_FAILONERROR,false);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
//if($this->readTimeout){
curl_setopt($ch,CURLOPT_TIMEOUT,300);
//}
//if($this->connectTimeout){
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,300);
//}
curl_setopt($ch,CURLOPT_USERAGENT,"top-sdk-php");
//https 请求
if(strlen($url)>5&&strtolower(substr($url,0,5))=="https"){
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
} //POST
if(is_array($postFields)&&0<count($postFields)){
$postBodyString="";
$postMultipart=false;
foreach($postFields as $k=>$v){
if(!is_string($v))
continue ;
//判断是不是文件上传
if("@"!=substr($v,0,1)){
$postBodyString.="$k=".urlencode($v)."&";
}else{
//文件上传用multipart/form-data,否则用www-form-urlencoded
$postMultipart=true;
if(class_exists('\CURLFile')){
$postFields[$k]=new \CURLFile(substr($v,1));
}
}
}
unset($k,$v);
curl_setopt($ch,CURLOPT_POST,true);
if($postMultipart){
if(class_exists('\CURLFile')) {
curl_setopt($ch,CURLOPT_SAFE_UPLOAD,true);
}else{
if(defined('CURLOPT_SAFE_UPLOAD')){
curl_setopt($ch,CURLOPT_SAFE_UPLOAD,false);
}
}
curl_setopt($ch,CURLOPT_POSTFIELDS,$postFields);
}else{
$header=array("content-type:application/x-www-form-urlencoded;charset=UTF-8");
curl_setopt($ch,CURLOPT_HTTPHEADER,$header);
curl_setopt($ch,CURLOPT_POSTFIELDS,substr($postBodyString,0,-1));
}
}
$reponse=curl_exec($ch);
if (curl_errno($ch)){
throw new Exception(curl_error($ch),0);
}else{
$httpStatusCode = curl_getinfo($ch, CURLINFO_HTTP_CODE);
if(200!==$httpStatusCode){
throw new Exception($reponse,$httpStatusCode);
}
}
curl_close($ch);
return $reponse;
} function curl_with_memory_file($url, $postFields = null, $fileFields = null){
$ch=curl_init();
curl_setopt($ch,CURLOPT_URL, $url);
curl_setopt($ch,CURLOPT_FAILONERROR,false);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,true);
//if($this->readTimeout){
curl_setopt($ch,CURLOPT_TIMEOUT,300);
//}
//if($this->connectTimeout){
curl_setopt($ch,CURLOPT_CONNECTTIMEOUT,300);
//}
curl_setopt($ch,CURLOPT_USERAGENT,"top-sdk-php" );
//https 请求
if(strlen($url)>5&&strtolower(substr($url,0,5))=="https"){
curl_setopt($ch,CURLOPT_SSL_VERIFYPEER,false);
curl_setopt($ch,CURLOPT_SSL_VERIFYHOST,false);
}
//生成分隔符
$delimiter='-------------'.uniqid();
//先将post的普通数据生成主体字符串
$data='';
if($postFields!=null){
foreach($postFields as $name=>$content) {
$data.="--".$delimiter."\r\n";
$data.='Content-Disposition:form-data;name="'.$name.'"';
//multipart/form-data 不需要urlencode,参见 http:stackoverflow.com/questions/6603928/should-i-url-encode-post-data
$data.="\r\n\r\n".$content."\r\n";
}
unset($name,$content);
} //将上传的文件生成主体字符串
if($fileFields!=null){
foreach($fileFields as $name=>$file) {
$data.="--".$delimiter."\r\n";
$data.='Content-Disposition:form-data; name="'.$name.'";filename="'.$file['name']."\"\r\n";
$data.='Content-Type:'.$file['type']."\r\n\r\n";//多了个文档类型
$data.=$file['content']."\r\n";
}
unset($name,$file);
}
//主体结束的分隔符
$data.="--".$delimiter."--";
curl_setopt($ch,CURLOPT_POST,true);
curl_setopt($ch,CURLOPT_HTTPHEADER,array(
'Content-Type: multipart/form-data;boundary='.$delimiter,
'Content-Length:'.strlen($data))
);
curl_setopt($ch,CURLOPT_RETURNTRANSFER,1);
curl_setopt($ch,CURLOPT_POSTFIELDS,$data); $reponse=curl_exec($ch);
unset($data); if(curl_errno($ch)){
throw new Exception(curl_error($ch),0);
}else{
$httpStatusCode=curl_getinfo($ch,CURLINFO_HTTP_CODE);
if (200!==$httpStatusCode){
throw new Exception($reponse,$httpStatusCode);
}
}
curl_close($ch);
return $reponse;
} print_r(curl_with_memory_file("http://localhost/aa.php",
array("a"=>1,"b"=>2),
array(
array(
"name"=>"a.png",
"type"=>"application/x-png",
"content"=>file_get_contents("http://pic002.cnblogs.com/images/2011/42876/2011050119000033.png")
),
array(
"name"=>"b.png",
"type"=>"application/x-png",
"content"=>file_get_contents("http://pic002.cnblogs.com/images/2011/42876/2011050119000033.png")
)
)
));
print_r(curl("http://localhost/aa.php",array("a"=>1,"b"=>2,"c"=>3,"d"=>"@d:/TB1eH7vNFXXXXcLXpXXwu0bFXXX.png")));
?>
附件:http://files.cnblogs.com/files/mengdejun/curl_fun.zip
淘宝SDK扒出来的CURL调用含文件上传代码的更多相关文章
- springMVC含文件上传调用ajax无法连接后台
springMVC在使用ajax进行后台传值的时候发现找不到对应的requestMapping(""),无法进入后台,在多次试验后确定是 MultipartFile对象与ajax冲 ...
- 利用 PHP CURL zip压缩文件上传
$postData['file'] = "@".getcwd()."/../attachment/qianbao/{$customer_id}.zip"; $t ...
- curl文件上传有两种方式,一种是post_fileds,一种是infile
curl文件上传有两种方式,一种是POSTFIELDS,一种是INFILE,POSTFIELDS传递@实际地址,INFILE传递文件流句柄! );curl_setopt($ch, CURLOPT_PO ...
- 接入淘宝SDK(OneSDK)和支付宝SDK(AlipaySDK)出现 duplicate symbols for architecture i386
起初我在我的项目中先接入了AlipaySDK,没有出现什么问题,之后想要接入淘宝SDK之后,就出现了duplicate symbols for architecture i386的错误 经过一段时间排 ...
- php curl文件上传兼容php5.0~5.6各版本
PHP 5.0~5.6 各版本兼容的cURL文件上传 最近做的一个需求,使用PHP cURL上传文件.踩坑若干,整理如下. 不同版本PHP之间cURL的区别 PHP的cURL支持通过给CURL_POS ...
- Ceph RGW服务 使用s3 java sdk 分片文件上传API 报‘SignatureDoesNotMatch’ 异常的定位及规避方案
import java.io.File; import com.amazonaws.AmazonClientException; import com.amazonaws.auth.profile ...
- php curl向远程服务器上传文件
<?php /** * test.php: */ header('content-type:text/html;charset=utf8'); $ch = curl_init(); //加@符号 ...
- FileZilla命令行实现文件上传以及CreateProcess实现静默调用
应用需求: 用户在选择渲染作业时面临两种情况:一是选择用户远程存储上的文件:二是选择本地文件系统中的文件进行渲染.由于渲染任务是在远程主机上进行的,实际进行渲染时源文件也是在ftp目录 ...
- 百度editor调用【图片上传阿里云】
百度editor调用简单,但是图片和文件上传阿里云就有点难度了.下面我详细说一下. 百度富文本编辑器下载地址:http://ueditor.baidu.com/website/download.htm ...
随机推荐
- css单位盘点
css单位有:px,em,rem,vh,vw,vmin,vmax,ex,ch 等等 1.px单位最常见,也最直接,这里不做介绍. 2.em:em的值并不是固定,它继承父级元素的字体大小,所以层数越深字 ...
- Python全栈开发【re正则模块】
re正则模块 本节内容: 正则介绍 元字符及元字符集 元字符转义符 re模块下的常用方法 正则介绍(re) 正则表达式(或 RE)是一种小型的.高度专业化的编程语言. 在Python中,它内嵌在Pyt ...
- connect/express 的参考
1.Node.js[5] connect & express简介 对connect中间件的分类比较容易理解. http://www.cnblogs.com/luics/archive/2 ...
- MySql卸载重新安装出现Start service没有响应的解决办法(64位)
昨天因为自己手欠,不小心把mysql卸载了,于是又得重新安装,但是每次到了最后一步就报没有响应,于是就去寻找解决办法,如下就是啦! 安装Mysql卸载后又重新安装,每次到最后Start service ...
- Xcode 快速开发 代码块
Xcode的代码片段(Code Snippets)创建自定义的代码片段,当你重用这些代码片段时,会给你带来很大的方便. 常用的: 1.strong:@property (nonatomic,stron ...
- ORA-12541:TNS:no listener 客户端tnsnames.ora配置,以及服务端listener.ora配置
需求:客户端(192.168.25.1)需要访问服务端(192.168.7.215)的Oracle库ORCL. 步骤一:配置客户端tnsnames.ora 步骤二:配置服务端listener.ora ...
- python之路:Day03 --- Python基础3 >>函数
本节内容 1.函数基本语法及特性 2.参数 3.局部变量与全局变量 4.返回值 嵌套函数 5.递归 6.匿名函数 7.高阶函数 8.内置函数 一.函数基本语法及特性 区别 面向过程编程:根据业务逻辑从 ...
- Windows下用tree命令生成目录树
有时候我们想为某个目录制作一个文档结构图,在Windows上,我们知道是使用tree命令. 但是,默认情况下tree只显示子目录名,而不显示子目录里的文件名,需要加上/F参数才能显示完整的文件名. ...
- 11g新特性-使用DNFS
NFS相信应该都很熟悉了,但是我们对它的性能一直有所诟病.Oracle在10g版本通过允许对数据库文件直接IO引入ASM.在11g版本中,Oracle对NFS提供了类似的增强,为了改进NFS的性能,开 ...
- winform快速开发平台 -> 基础组件之分页控件
一个项目控件主要由及部分的常用组件,当然本次介绍的是通用分页控件. 处理思想:我们在处理分页过程中主要是针对数据库操作. 一般情况主要是传递一些开始位置,当前页数,和数据总页数以及相关关联的业务逻辑. ...