<?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调用含文件上传代码的更多相关文章

  1. springMVC含文件上传调用ajax无法连接后台

    springMVC在使用ajax进行后台传值的时候发现找不到对应的requestMapping(""),无法进入后台,在多次试验后确定是 MultipartFile对象与ajax冲 ...

  2. 利用 PHP CURL zip压缩文件上传

    $postData['file'] = "@".getcwd()."/../attachment/qianbao/{$customer_id}.zip"; $t ...

  3. curl文件上传有两种方式,一种是post_fileds,一种是infile

    curl文件上传有两种方式,一种是POSTFIELDS,一种是INFILE,POSTFIELDS传递@实际地址,INFILE传递文件流句柄! );curl_setopt($ch, CURLOPT_PO ...

  4. 接入淘宝SDK(OneSDK)和支付宝SDK(AlipaySDK)出现 duplicate symbols for architecture i386

    起初我在我的项目中先接入了AlipaySDK,没有出现什么问题,之后想要接入淘宝SDK之后,就出现了duplicate symbols for architecture i386的错误 经过一段时间排 ...

  5. php curl文件上传兼容php5.0~5.6各版本

    PHP 5.0~5.6 各版本兼容的cURL文件上传 最近做的一个需求,使用PHP cURL上传文件.踩坑若干,整理如下. 不同版本PHP之间cURL的区别 PHP的cURL支持通过给CURL_POS ...

  6. Ceph RGW服务 使用s3 java sdk 分片文件上传API 报‘SignatureDoesNotMatch’ 异常的定位及规避方案

    import java.io.File;   import com.amazonaws.AmazonClientException; import com.amazonaws.auth.profile ...

  7. php curl向远程服务器上传文件

    <?php /** * test.php: */ header('content-type:text/html;charset=utf8'); $ch = curl_init(); //加@符号 ...

  8. FileZilla命令行实现文件上传以及CreateProcess实现静默调用

    应用需求:         用户在选择渲染作业时面临两种情况:一是选择用户远程存储上的文件:二是选择本地文件系统中的文件进行渲染.由于渲染任务是在远程主机上进行的,实际进行渲染时源文件也是在ftp目录 ...

  9. 百度editor调用【图片上传阿里云】

    百度editor调用简单,但是图片和文件上传阿里云就有点难度了.下面我详细说一下. 百度富文本编辑器下载地址:http://ueditor.baidu.com/website/download.htm ...

随机推荐

  1. The difference between QA, QC, and Test Engineering

    Tuesday, March 06, 2007 Posted by Allen Hutchison, Engineering Manager and Jay Han, Software Enginee ...

  2. CMS系统存储路径

    CMS系统特点:前后端分离 index.html 首页文件index.php 管理后台的页面 api文件夹: 提供的接口 caches文件夹: 缓存文件 html文件夹:  生成的静态页面 phpcm ...

  3. 利用代码添加autolayout约束

    1.概述 通常我们通过storyboard能够完成的,代码也能够完成,所以这里介绍下代码实现约束的添加,通常我们不这么干(在不使用第三方框架的情况下,使用系统自带的类添加约束特别繁琐),所以这里仅仅简 ...

  4. 非旋treap模板

    bzoj3580 非旋转treap 在大神教导下发现split一段区间时先split右边再split左边比较好写 #include <cstdio> #include <cstdli ...

  5. Lintcode 157. 判断字符串是否没有重复字符

    ------------------------ 因为字符究竟是什么样的无法确定(比如编码之类的),恐怕是没办法假设使用多大空间(位.数组)来标记出现次数的,集合应该可以但感觉会严重拖慢速度... 还 ...

  6. KNN识别图像上的数字及python实现

    领导让我每天手工录入BI系统中的数据并判断数据是否存在异常,若有异常点,则检测是系统问题还是业务问题.为了解放双手,我决定写个程序完成每天录入管理驾驶舱数据的任务.首先用按键精灵录了一套脚本把系统中的 ...

  7. vnc远程运行3D游戏

    使用的版本:VNC-5.2.3-Windows.exe   vnc官网 安装的过程中需要输入license key,以下给出一些enterprise license(最大权限的License): K5 ...

  8. Android 登录界面与首页的设计

    全屏效果 //取消标题,取消状态栏 this.requestWindowFeature(Window.FEATURE_NO_TITLE); this.getWindow().setFlags(Wind ...

  9. STC系列STC10F芯片解密STC10L单片机破解复制技术

    STC系列STC10F芯片解密STC10L单片机破解 STC10F12XE | STC10F12 | STC10F10XE | STC10F10解密 STC10F08XE | STC10F08 | S ...

  10. Tray - a SharedPreferences replacement for Android

    一个代替SharedPreferences的开源库, no Editor, no commit() no apply(),因此不存在UI卡顿现象,并且支持多线程,在一个线程中存另一个线程中取数据. h ...