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 相关文章推荐
一个查看session内容的函数
Oct 09 PHP
PHP安全性漫谈
Jun 28 PHP
测试php连接mysql是否成功的代码分享
Jan 24 PHP
php调用nginx的mod_zip模块打包ZIP文件
Jun 11 PHP
php有道翻译api调用方法实例
Dec 22 PHP
PHP实现支持SSL连接的SMTP邮件发送类
Mar 05 PHP
PHP中余数、取余的妙用
Jun 29 PHP
Yii的Srbac插件用法详解
Jul 14 PHP
老生常谈PHP面向对象之注册表模式
May 26 PHP
PHP htmlspecialchars() 函数实例代码及用法大全
Sep 18 PHP
php设计模式之策略模式实例分析【星际争霸游戏案例】
Mar 26 PHP
thinkphp5.1框架模板赋值与变量输出示例
May 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
PHP 组件化编程技巧
2009/06/06 PHP
PHP常用的文件操作函数经典收藏
2013/04/02 PHP
PHP的curl实现get,post和cookie(实例介绍)
2013/06/17 PHP
PHP中4个加速、缓存扩展的区别和选用建议
2014/03/12 PHP
php简单实现无限分类树形列表的方法
2015/03/27 PHP
Laravel最佳分割路由文件(routes.php)的方式
2016/08/04 PHP
PHP+redis实现的购物车单例类示例
2019/02/02 PHP
JavaScript 动态改变图片大小
2009/06/11 Javascript
javawscript 三级菜单的实现原理
2009/07/01 Javascript
浅析XMLHttpRequest的缓存问题
2013/12/13 Javascript
html的DOM中Event对象onabort事件用法实例
2015/01/21 Javascript
jQuery+css3动画属性制作猎豹浏览器宽屏banner焦点图
2015/03/16 Javascript
Javascript中indexOf()和lastIndexOf应用方法实例
2016/08/24 Javascript
Java  Spring 事务回滚详解
2016/10/17 Javascript
jQuery弹出div层过2秒自动消失
2016/11/29 Javascript
JS仿JQuery选择器功能
2017/03/08 Javascript
NodeJs中express框架的send()方法简介
2017/06/20 NodeJs
详解Vue快速零配置的打包工具——parcel
2018/01/16 Javascript
vue2.0 elementUI制作面包屑导航栏
2018/02/22 Javascript
nodejs读取并去重excel文件
2018/04/22 NodeJs
React+Webpack快速上手指南(小结)
2018/08/15 Javascript
教你如何用Node实现API的转发(某音乐)
2019/09/20 Javascript
vue 解决路由只变化参数页面组件不更新问题
2019/11/05 Javascript
VUE-ElementUI 自定义Loading图操作
2020/11/11 Javascript
python实现随机森林random forest的原理及方法
2017/12/21 Python
python实现textrank关键词提取
2018/06/22 Python
tensorflow 初始化未初始化的变量实例
2020/02/06 Python
python 多线程死锁问题的解决方案
2020/08/25 Python
CSS3 中filter(滤镜)属性使用详解
2020/04/07 HTML / CSS
公司离职证明范本
2014/10/17 职场文书
党员违纪检讨书怎么写
2014/11/01 职场文书
因身体原因离职的辞职信范文
2015/05/12 职场文书
聘任书格式及范文
2015/09/21 职场文书
详解Redis复制原理
2021/06/04 Redis
详解Java实现数据结构之并查集
2021/06/23 Java/Android
JavaGUI模仿QQ聊天功能完整版
2021/07/04 Java/Android