PHP实现通过CURL上传文件功能示例


Posted in PHP onMay 30, 2018

本文实例讲述了PHP实现通过CURL上传文件功能。分享给大家供大家参考,具体如下:

PHP使用CURL上传文件只需发送一个POST请求就可以了,在请求中设置某个字段为需要上传的文件全路径,并且以"@"开头,然后使用CURL把该变量以POST方式发送到服务器,在服务端即可以从超级全局变量$_FILES中取到相应的上传文件信息。

下面我们以一个例子来展示这个过程。

假设本地有一个文本文件log.txt,其路径为"/www/test/log.txt",内容如下:

this is a file for test
hello PythonTab!

为了把这个文件上传给服务端的脚本http://yourwebname.com/upload.php,我们在本地写了一个名为curl_file.php的脚本,内容如下:

<?php
$url = "http://yourwebname.com/upload.php";
$post_data = array(
"foo" => "bar",
//要上传的本地文件地址
"upload" = > "@/www/test/log.txt"
);
$ch = curl_init();
curl_setopt($ch , CURLOPT_URL , $url);
curl_setopt($ch , CURLOPT_RETURNTRANSFER, 1);
curl_setopt($ch , CURLOPT_POST, 1);
curl_setopt($ch , CURLOPT_POSTFIELDS, $post_data);
$output = curl_exec($ch);
curl_close($ch);
echo $output;
?>

curl_file.php的逻辑很简单,设置POST变量$post_data,其中upload指向需要发送的文件。这里要注意,我们之前使用POST都是发送一个字符串,然后在服务器端使用file_get_contents("php//input")来获取该字符串,和这里的用法不一样,其实POST也可以像GET一样,发送键值对。在服务端有一个超级全局变量$_POST可以像$_GET一样,获取相应的POST数据的值。需要注意的是,上传文件的变量不是存在着$_POST中,而是在$_FILES中。

为了展示服务端收到上述代码的文件上传请求的逻辑,我们在upload.php中写了以下代码:

<?php
echo var_export($_FILES,true);
echo file_get_contents($_FILES['upload']['tmp_name']);
copy($_FILES['upload']['tmp_name'], "./log_copy.txt");
?>

upload.php首先使用var_export$_FILES变量输出到标准输出,然后使用file_get_contents读取$_FILES['upload']['tmp_name']所指文件的内容,并输出到标准输出,然后把$_FILES['upload']['tmp_name']所指文件自制到当前目录的log_copy.txt文件中。该脚本的标准输出如下:

array(
'upload' =>
array(
'name' => 'log.txt',
'type' => 'application/octet-stream',
'tmp_name' => '/tmp/phpLUB59F',
'error' => 0,
'size' => 36,
)
)
this is a file for test
hello PythonTab!

可以看到$_FILES变量中有一个upload数组,对应到上传文件描述信息,其中name和type分别表示名称和类型。tmp_name比较关键,服务端在接收到上传文件之后,会把文件写在一个临时文件中,这个临时文件的名字就是tmp_name的值,这也是为什么我们读取该文件可以获取一log.txt的文件内容。一般在服务端接收到上传文件后都需要立即读取该文件或者把文件复制到别外一个文件中,因为tmp_name所指的临时文件在服务端脚本执行完毕后会被删除掉,upload.php脚本的最后一行就是把临时文件复制到我们的目标文件中。

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
PHP可变函数的使用详解
Jun 14 PHP
一个基于phpQuery的php通用采集类分享
Apr 09 PHP
php获取URL中带#号等特殊符号参数的解决方法
Sep 02 PHP
PHP中创建图像并绘制文字的例子
Nov 19 PHP
php实现Session存储到Redis
Nov 11 PHP
Yii2 ActiveRecord多表关联及多表关联搜索的实现
Jun 30 PHP
php进行ip地址掩码运算处理的方法
Jul 11 PHP
PHP基于DOM创建xml文档的方法示例
Feb 08 PHP
完美解决php 导出excle的.csv格式的数据时乱码问题
Feb 18 PHP
thinkPHP显示不出验证码的原因与解决方法分析
May 20 PHP
PHP封装的简单连接MongoDB类示例
Feb 13 PHP
PHP设计模式之抽象工厂模式实例分析
Mar 25 PHP
php实现微信支付之现金红包
May 30 #PHP
php微信支付之公众号支付功能
May 30 #PHP
php实现微信原生支付(扫码支付)功能
May 30 #PHP
php实现支付宝当面付(扫码支付)功能
May 30 #PHP
PHP ADODB生成HTML表格函数rs2html功能【附错误处理函数用法】
May 29 #PHP
PHP ADODB生成下拉列表框功能示例
May 29 #PHP
Laravel实现短信注册的示例代码
May 29 #PHP
You might like
PHPMyAdmin 快速配置方法
2009/05/11 PHP
ThinkPHP控制器详解
2015/07/27 PHP
降低PHP Redis内存占用
2017/03/23 PHP
PHP实现批量重命名某个文件夹下所有文件的方法
2017/09/04 PHP
PHP依赖注入原理与用法分析
2018/08/21 PHP
Laravel框架基于中间件实现禁止未登录用户访问页面功能示例
2019/01/17 PHP
PHP 并发场景的几种解决方案
2019/06/14 PHP
javascript正则匹配汉字、数字、字母、下划线
2014/04/10 Javascript
JavaScript 学习笔记之操作符(续)
2015/01/14 Javascript
jQuery实现类似标签风格的导航菜单效果代码
2015/08/25 Javascript
JavaScript常用基础知识强化学习
2015/12/09 Javascript
jQuery循环遍历子节点并获取值的方法
2016/04/14 Javascript
原生js实现简单的链式操作
2017/07/04 Javascript
vue监听滚动事件的方法
2020/12/21 Vue.js
[02:39]DOTA2英雄基础教程 天怒法师
2013/11/29 DOTA
[28:07]完美世界DOTA2联赛PWL S3 Phoenix vs INK ICE 第二场 12.13
2020/12/17 DOTA
Web服务器框架 Tornado简介
2014/07/16 Python
Python中类的定义、继承及使用对象实例详解
2015/04/30 Python
windows下pycharm安装、创建文件、配置默认模板
2018/07/31 Python
python+unittest+requests实现接口自动化的方法
2018/11/29 Python
python中的反斜杠问题深入讲解
2019/08/12 Python
python修改FTP服务器上的文件名
2019/09/11 Python
python实现文法左递归的消除方法
2020/05/22 Python
Does C# support multiple inheritance? (C#支持多重继承吗)
2012/01/04 面试题
大学生毕业自我鉴定
2013/11/06 职场文书
烹调加工管理制度
2014/02/04 职场文书
2014年前台文员工作总结
2014/12/08 职场文书
给老婆的保证书
2015/01/16 职场文书
2015年高中班级工作总结
2015/07/21 职场文书
企业安全生产检查制度
2015/08/06 职场文书
62句有关感恩节文案(推荐收藏)
2019/11/28 职场文书
vue组件的路由高亮问题解决方法
2021/05/11 Vue.js
给numpy.array增加维度的超简单方法
2021/06/02 Python
Java各种比较对象的方式的对比总结
2021/06/20 Java/Android
javascript条件式访问属性和箭头函数介绍
2021/11/17 Javascript
Vue OpenLayer测距功能的实现
2022/04/20 Vue.js