curl介绍 https://www.cnblogs.com/niuben/p/11558420.html
curl是一个开源的网络链接库,支持http, https, ftp, gopher, telnet, dict, file, and ldap 协议。之前均益介绍了python版本的pycurl http://junyiseo.com/python/607.html ,现在介绍怎么使用php版本的URL.
curl get请求

function curl_get($url){
$header = array(
'Accept: application/json',
);
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, $url);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 0);
// 超时设置,以秒为单位
curl_setopt($curl, CURLOPT_TIMEOUT, 1);
// 超时设置,以毫秒为单位
// curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);
// 设置请求头
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, false);
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, false);
//执行命令
$data = curl_exec($curl);
// 显示错误信息
if (curl_error($curl)) {
print "Error: " . curl_error($curl);
} else {
// 打印返回的内容
var_dump($data);
curl_close($curl);
}
}

curl post请求

// $url 是请求的链接
// $postdata 是传输的数据,数组格式
function curl_post( $url, $postdata ) {
$header = array(
'Accept: application/json',
);
//初始化
$curl = curl_init();
//设置抓取的url
curl_setopt($curl, CURLOPT_URL, $url);
//设置头文件的信息作为数据流输出
curl_setopt($curl, CURLOPT_HEADER, 0);
//设置获取的信息以文件流的形式返回,而不是直接输出。
curl_setopt($curl, CURLOPT_RETURNTRANSFER, 1);
// 超时设置
curl_setopt($curl, CURLOPT_TIMEOUT, 10);
// 超时设置,以毫秒为单位
// curl_setopt($curl, CURLOPT_TIMEOUT_MS, 500);
// 设置请求头
curl_setopt($curl, CURLOPT_HTTPHEADER, $header);
curl_setopt($curl, CURLOPT_SSL_VERIFYPEER, FALSE );
curl_setopt($curl, CURLOPT_SSL_VERIFYHOST, FALSE );
//设置post方式提交
curl_setopt($curl, CURLOPT_POST, 1);
curl_setopt($curl, CURLOPT_POSTFIELDS, $postdata);
//执行命令
$data = curl_exec($curl);
// 显示错误信息
if (curl_error($curl)) {
print "Error: " . curl_error($curl);
} else {
// 打印返回的内容
var_dump($data);
curl_close($curl);
}
}

常用参数
| 选项 | 将 value 设置为 | 备注 |
|---|---|---|
| CURLOPT_AUTOREFERER | TRUE 时将根据 Location: 重定向时,自动设置 header 中的Referer:信息。 | |
| CURLOPT_BINARYTRANSFER | 设为 TRUE ,将在启用 CURLOPT_RETURNTRANSFER 时,返回原生的(Raw)输出。 | 从 PHP 5.1.3 开始,此选项不再有效果:使用CURLOPT_RETURNTRANSFER 后总是会返回原生的(Raw)内容。 |
| CURLOPT_COOKIESESSION | 设为 TRUE 时将开启新的一次 cookie 会话。它将强制 libcurl 忽略之前会话时存的其他 cookie。 libcurl 在默认状况下无论是否为会话,都会储存、加载所有 cookie。会话 cookie 是指没有过期时间,只存活在会话之中。 | |
| CURLOPT_CERTINFO | TRUE 将在安全传输时输出 SSL 证书信息到 STDERR。 | 在 cURL 7.19.1 中添加。 PHP 5.3.2 后有效。 需要开启 CURLOPT_VERBOSE 才有效。 |
| CURLOPT_CONNECT_ONLY | TRUE 将让库执行所有需要的代理、验证、连接过程,但不传输数据。此选项用于 HTTP、SMTP 和 POP3。 | 在 7.15.2 中添加。 PHP 5.5.0 起有效。 |
| CURLOPT_CRLF | 启用时将Unix的换行符转换成回车换行符。 | |
| CURLOPT_DNS_USE_GLOBAL_CACHE | TRUE 会启用一个全局的DNS缓存。此选项非线程安全的,默认已开启。 | |
| CURLOPT_FAILONERROR | 当 HTTP 状态码大于等于 400,TRUE 将将显示错误详情。 默认情况下将返回页面,忽略 HTTP 代码。 | |
| CURLOPT_SSL_FALSESTART | TRUE 开启 TLS False Start (一种 TLS 握手优化方式) | cURL 7.42.0 中添加。自 PHP 7.0.7 起有效。 |
| CURLOPT_FILETIME | TRUE 时,会尝试获取远程文档中的修改时间信息。 信息可通过curl_getinfo()函数的CURLINFO_FILETIME 选项获取。 | |
| CURLOPT_FOLLOWLOCATION | TRUE 时将会根据服务器返回 HTTP 头中的 "Location: " 重定向。(注意:这是递归的,"Location: " 发送几次就重定向几次,除非设置了 CURLOPT_MAXREDIRS,限制最大重定向次数。)。 | |
| CURLOPT_FORBID_REUSE | TRUE 在完成交互以后强制明确的断开连接,不能在连接池中重用。 | |
| CURLOPT_FRESH_CONNECT | TRUE 强制获取一个新的连接,而不是缓存中的连接。 | |
| CURLOPT_FTP_USE_EPRT | TRUE 时,当 FTP 下载时,使用 EPRT (和 LPRT)命令。 设置为 FALSE 时禁用 EPRT 和 LPRT,仅仅使用PORT 命令。 | |
| CURLOPT_FTP_USE_EPSV | TRUE 时,在FTP传输过程中,回到 PASV 模式前,先尝试 EPSV 命令。设置为 FALSE 时禁用 EPSV。 | |
| CURLOPT_FTP_CREATE_MISSING_DIRS | TRUE 时,当 ftp 操作不存在的目录时将创建它。 | |
| CURLOPT_FTPAPPEND | TRUE 为追加写入文件,而不是覆盖。 | |
| CURLOPT_TCP_NODELAY | TRUE 时禁用 TCP 的 Nagle 算法,就是减少网络上的小包数量。 | PHP 5.2.1 有效,编译时需要 libcurl 7.11.2 及以上。 |
| CURLOPT_FTPASCII | CURLOPT_TRANSFERTEXT 的别名。 | |
| CURLOPT_FTPLISTONLY | TRUE 时只列出 FTP 目录的名字。 | |
| CURLOPT_HEADER | 启用时会将头文件的信息作为数据流输出。 | |
| CURLINFO_HEADER_OUT | TRUE 时追踪句柄的请求字符串。 | 从 PHP 5.1.3 开始可用。CURLINFO_ 的前缀是有意的(intentional)。 |
| CURLOPT_HTTPGET | TRUE 时会设置 HTTP 的 method 为 GET,由于默认是 GET,所以只有 method 被修改时才需要这个选项。 | |
| CURLOPT_HTTPPROXYTUNNEL | TRUE 会通过指定的 HTTP 代理来传输。 | |
| CURLOPT_MUTE | TRUE 时将完全静默,无论是何 cURL 函数。 | 在 cURL 7.15.5 中移出(可以使用 CURLOPT_RETURNTRANSFER 作为代替) |
| CURLOPT_NETRC | TRUE 时,在连接建立时,访问~/.netrc文件获取用户名和密码来连接远程站点。 | |
| CURLOPT_NOBODY | TRUE 时将不输出 BODY 部分。同时 Mehtod 变成了 HEAD。修改为 FALSE时不会变成 GET。 | |
| CURLOPT_NOPROGRESS | TRUE 时关闭 cURL 的传输进度。
| |
| CURLOPT_NOSIGNAL | TRUE 时忽略所有的 cURL 传递给 PHP 进行的信号。在 SAPI 多线程传输时此项被默认启用,所以超时选项仍能使用。 | cURL 7.10时被加入。 |
| CURLOPT_PATH_AS_IS | TRUE 不处理 dot dot sequences (即 ../ ) | cURL 7.42.0 时被加入。 PHP 7.0.7 起有效。 |
| CURLOPT_PIPEWAIT | TRUE 则等待 pipelining/multiplexing。 | cURL 7.43.0 时被加入。 PHP 7.0.7 起有效。 |
| CURLOPT_POST | TRUE 时会发送 POST 请求,类型为:application/x-www-form-urlencoded,是 HTML 表单提交时最常见的一种。 | |
| CURLOPT_PUT | TRUE 时允许 HTTP 发送文件。要被 PUT 的文件必须在 CURLOPT_INFILE和CURLOPT_INFILESIZE 中设置。 | |
| CURLOPT_RETURNTRANSFER | TRUE 将curl_exec()获取的信息以字符串返回,而不是直接输出。 | |
| CURLOPT_SAFE_UPLOAD | TRUE 禁用 @ 前缀在 CURLOPT_POSTFIELDS 中发送文件。 意味着 @ 可以在字段中安全得使用了。 可使用 CURLFile 作为上传的代替。 | PHP 5.5.0 中添加,默认值 FALSE。 PHP 5.6.0 改默认值为 TRUE。. PHP 7 删除了此选项, 必须使用 CURLFile interface 来上传文件。 |
| CURLOPT_SASL_IR | TRUE 开启,收到首包(first packet)后发送初始的响应(initial response)。 | cURL 7.31.10 中添加,自 PHP 7.0.7 起有效。 |
| CURLOPT_SSL_ENABLE_ALPN | FALSE 禁用 SSL 握手中的 ALPN (如果 SSL 后端的 libcurl 内建支持) 用于协商到 http2。 | cURL 7.36.0 中增加, PHP 7.0.7 起有效。 |
| CURLOPT_SSL_ENABLE_NPN | FALSE 禁用 SSL 握手中的 NPN(如果 SSL 后端的 libcurl 内建支持),用于协商到 http2。 | cURL 7.36.0 中增加, PHP 7.0.7 起有效。 |
| CURLOPT_SSL_VERIFYPEER | FALSE 禁止 cURL 验证对等证书(peer's certificate)。要验证的交换证书可以在 CURLOPT_CAINFO 选项中设置,或在 CURLOPT_CAPATH中设置证书目录。 | 自cURL 7.10开始默认为 TRUE。从 cURL 7.10开始默认绑定安装。 |
| CURLOPT_SSL_VERIFYSTATUS | TRUE 验证证书状态。 | cURL 7.41.0 中添加, PHP 7.0.7 起有效。 |
| CURLOPT_TCP_FASTOPEN | TRUE 开启 TCP Fast Open。 | cURL 7.49.0 中添加, PHP 7.0.7 起有效。 |
| CURLOPT_TFTP_NO_OPTIONS | TRUE 不发送 TFTP 的 options 请求。 | 自 cURL 7.48.0 添加, PHP 7.0.7 起有效。 |
| CURLOPT_TRANSFERTEXT | TRUE 对 FTP 传输使用 ASCII 模式。对于LDAP,它检索纯文本信息而非 HTML。在 Windows 系统上,系统不会把 STDOUT 设置成二进制 模式。 | |
| CURLOPT_UNRESTRICTED_AUTH | TRUE 在使用CURLOPT_FOLLOWLOCATION重定向 header 中的多个 location 时继续发送用户名和密码信息,哪怕主机名已改变。 | |
| CURLOPT_UPLOAD | TRUE 准备上传。 | |
| CURLOPT_VERBOSE | TRUE 会输出所有的信息,写入到STDERR,或在CURLOPT_STDERR中指定的文件。 |
[PHP]curl上传多文件
https://www.cnblogs.com/yiyide266/p/7273062.html
码一下curl上传多文件的行
5.5之前版本的写法
$file = array(
'pic[0]'=>"@E:\\wwwroot\\10003\\temp_56.ini;type=text/html;filename=temp_56.ini",
'pic[1]'=>"@E:\\wwwroot\\10003\\temp_29.html;type=text/html;filename=temp_29.html"
);
5.5以上版本的写法
php 5.5 version or above
$file = array(
'pic[0]'=>new CURLFile('E:\\wwwroot\\10003\\temp_56.ini', 'text/html', 'temp_56.ini'),
'pic[1]'=>new CURLFile('E:\\wwwroot\\10003\\temp_29.html', 'text/html', 'temp_29.html')
);
合并其他的POST参数,POST出去

$data = array_merge($file, $data); $ch = curl_init(); curl_setopt($ch, CURLOPT_URL, $url); curl_setopt($ch, CURLOPT_POST, true ); curl_setopt($ch, CURLOPT_POSTFIELDS, $data); curl_setopt($ch, CURLOPT_HEADER, false); curl_setopt($ch, CURLOPT_RETURNTRANSFER, true); // curl_getinfo($ch); $return_data = curl_exec($ch); curl_close($ch); echo $return_data;

PHP实现图片(文件)上传
https://www.cnblogs.com/xyyl/p/11097050.html
这几天整理做过的php项目,感觉这个经常会用到,传上来共享一下咯
首先,前端界面
1、表单的首行需要加上enctype="multipart/form-data",需要上传的图片必须设置 type="file"表示选择文件
<form id="img_form" method="post" class="form-horizontal" role="form" enctype="multipart/form-data">
<label class="col-sm-3 control-label" for="image">图片:</label>
<div class="col-sm-9 require">
<input type="hidden" name="MAX_FILE_SIZE" value="2000000">//文件最大尺寸
<input type="file" class="form-control" name="image" id="image">
</div>
</div>
</form>
2、为表单添加事件,我用的是ajax
因为图片在是二进制传输,所以需要用new FormData(this)获取表单非文本类的数据(注包括文本类),纯文本类数据可用$(this).serialize();
$('#form1').submit(function (e) {
e.preventDefault();
var data=new FormData(this);//获取非文本类的数据
$.ajax({
url:"php/add.php",//处理页面的路径
data:data,//通过json格式将一组数据传过去
type:"post",//数据的提交和传递方式,最好用POST
dataType:"json",//页面返回值的类型,共有三种:TEXT,JSON,XML可选
cache:false,
contentType:false,
processData:false,
success:function(res){//回调函数:如果ajax调用成功,就执行这个success后面的函数,(data)当做参数返回过来
if (res.flag===1){
alert('上传成功!');
} else if(res.flag===2){
alert('网络或其他未知错误,请重试!')
}else{
alert('图片格式错误,请重试!')
}
},
error: function () {
alert("error")
}
});
});
3、编写php文件
connect.php
数据库连接文件
<?php
$link=new PDO("mysql:host=localhost;port=3306;dbname=db","root","");
$link->query("set names utf8");
add.php
-
extract($_POST):批量获取前端post方式传过来的数据,使用参数时参数名为前端传过来的初始名。
-
in_array(search,array,type):搜索数组中是否存在指定的值,即元素是否存在与数组,返回true或false。
search,必需,规定要在数组搜索的值。array,必需,规定要搜索的数组。type,可选,如果设置该参数为 true,则检查搜索的数据与数组的值的类型是否相同。 -
count():获取数组元素个数
-
$_FILES['image']['name']:'image'为前端图片定义的name,后面的'name'不可变

-
file_exists():检查图片是否存在文件夹,存在返回ture,否则false
-upload:是我图片上传目标文件
<?php
extract($_POST);
$date = date('Y-m-d');
$file_name = $_FILES['image']['name'];//获取缓存区图片,格式不能变
$type = array("jpg", "gif", 'png', 'bmp');//允许选择的图片类型
$ext = explode(".", $file_name);//拆分获取图片名
$ext = $ext[count($ext) - 1];//取图片的后缀名
if (in_array($ext,$type)){
do{
$new_name = get_file_name(6).'.'.$ext;
$path='upload/'.$new_name;//upload为目标文件夹
}while (file_exists("../" . $path));//检查图片是否存在文件夹,存在返回ture,否则false
$temp_file=$_FILES['image']['tmp_name'];//获取服务器里图片
include_once ('connect.php');//连接数据库
$result = $link->exec("INSERT INTO `news`(`title`,`author`, `content`, `src`,`time`) VALUES ('$title','$author','$content','$path','$date')");
if ($result){
move_uploaded_file($temp_file,"../" .$path);//移动临时文件到目标路径
$arr['flag']=1;
$arr['detail']=[$title,$author,$content,$path];
}else{
$arr['flag']=2;
}
}else{
$arr['flag']=3;
}
function get_file_name($len)//获取一串随机数字,用于做上传到数据库中文件的名字
{
$new_file_name = 'A_';
$chars = "1234567890qwertyuiopasdfghjklzxcvbnm";//随机生成图片名
for ($i = 0; $i < $len; $i++) {
$new_file_name .= $chars[mt_rand(0, strlen($chars) - 1)];
}
return $new_file_name;
}
echo json_encode($arr);
PHP 利用CURL(HTTP)实现服务器上传文件至另一服务器
https://www.cnblogs.com/lzs-888/p/10790637.html

// 上传端
/**
* 向目标地址推送xls文件
* @Date 2019/4/29
*/
public function putXls()
{
// 目标接口
$url = "http://xxx";
// 初始化 cURL 会话, 如果提供url,CURLOPT_URL 选项将会被设置成这个值
$ch = curl_init($url);
// 获取CURLFile实例
$xlsCurlFile = $this->makeCurlFile(base_path()."/public/tby.xls");
$data = array('xls' => $xlsCurlFile);
// TRUE 时会发送 POST 请求,类型为:application/x-www-form-urlencoded,是 HTML 表单提交时最常见的一种。
curl_setopt($ch, CURLOPT_POST, 1);
// 从 PHP 5.5.0 开始, @ 前缀已被废弃,文件可通过 CURLFile 发送。 设置 CURLOPT_SAFE_UPLOAD 为 TRUE 可禁用 @ 前缀发送文件,以增加安全性。
curl_setopt($ch, CURLOPT_POSTFIELDS, $data);
// 执行给定的 cURL 会话
// 成功时返回 TRUE, 或者在失败时返回 FALSE。 然而,如果 设置了 CURLOPT_RETURNTRANSFER 选项,函数执行成功时会返回执行的结果,失败时返回 FALSE 。
$result = curl_exec($ch);
if (curl_errno($ch)) {// 返回错误代码或在没有错误发生时返回 0 (零)。
// 返回错误信息,或者如果没有任何错误发生就返回 '' (空字符串)。
$result = curl_error($ch);
}
// 关闭 cURL 会话
curl_close($ch);
}
/**
* 根据文件路径获取一个CURLFile类实例
* @param string $file 文件路径
* @return CURLFile
* @Date 2019/4/29
*/
private function makeCurlFile(string $file)
{
/**
* .xls mime为 application/vnd.ms-excel
* .xlsx mime为 application/vnd.openxmlformats-officedocument.spreadsheetml.sheet
* 可参考 https://developer.mozilla.org/zh-CN/docs/Web/HTTP/Basics_of_HTTP/MIME_types/Complete_list_of_MIME_types
*
* 注意:也可以使用 finfo类动态获取,但需要装fileinfo扩展
* demo:
$result = new finfo();
if (is_resource($result) === true) {
return $result->file($filename, FILEINFO_MIME_TYPE);
}
return false;
*/
$mime = "application/vnd.ms-excel";
$info = pathinfo($file);
$name = $info['basename'];
$output = new CURLFile($file, $mime, $name);
return $output;
}
// 接收端
public function getFile()
{
// 保存的文件夹,需要注意所在用户组是否有写入权限
$uploads_dir = base_path()."/public/test";
$xlsFiles = $_FILES["xls"] ?? null;
if($xlsFiles){
if ($xlsFiles["error"] == UPLOAD_ERR_OK) {
$tmp_name = $xlsFiles["tmp_name"];
$name = $xlsFiles["name"];
move_uploaded_file($tmp_name, "$uploads_dir/$name");
}
// todo success
}else{
// todo fail
}
}

注意:需要打开php curl扩展
参考:
https://www.php.net/manual/zh/book.curl.php
https://www.php.net/manual/zh/class.curlfile.php
本文深入解析CURL库的功能,涵盖HTTP、HTTPS等协议支持,以及GET、POST请求的实现。并详细介绍了如何使用PHP版CURL进行文件上传,包括多文件上传的技巧和不同版本的写法。
225

被折叠的 条评论
为什么被折叠?



