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 相关文章推荐
风格模板初级不完全修改教程
Oct 09 PHP
一个PHP日历程序
Dec 06 PHP
PHP 源代码压缩小工具
Dec 22 PHP
php的一些小问题
Jul 03 PHP
PHP的SQL注入过程分析
Jan 06 PHP
curl实现站外采集的方法和技巧
Jan 31 PHP
php实现数组筛选奇数和偶数示例
Apr 11 PHP
Yii实现的多级联动下拉菜单
Jul 13 PHP
分享PHP-pcntl 实现多进程代码
Sep 30 PHP
详解PHP文件的自动加载(autoloading)
Feb 04 PHP
Laravel 读取 config 下的数据方法
Oct 13 PHP
在laravel中实现ORM模型使用第二个数据库设置
Oct 24 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用GD库生成高质量的缩略图片
2011/03/09 PHP
thinkphp5 migrate数据库迁移工具
2018/02/20 PHP
JavaScript 开发工具webstrom使用指南
2014/12/09 Javascript
Javascript 运动中Offset的bug解决方案
2014/12/24 Javascript
JavaScript中用字面量创建对象介绍
2014/12/31 Javascript
介绍一个简单的JavaScript类框架
2015/06/24 Javascript
javascript动画之磁性吸附效果篇
2016/12/09 Javascript
jquery将标签元素的高设为屏幕的百分比
2017/04/19 jQuery
详解vue+css3做交互特效的方法
2017/11/20 Javascript
在vscode中统一vue编码风格的方法
2018/02/22 Javascript
vue的toast弹窗组件实例详解
2018/05/14 Javascript
vue富文本框(插入文本、图片、视频)的使用及问题小结
2018/08/17 Javascript
代码分析vue中如何配置less
2018/09/28 Javascript
利用原生JavaScript实现造日历轮子实例代码
2019/05/08 Javascript
js实现掷骰子小游戏
2019/10/24 Javascript
vue props 一次传多个值实例
2020/07/22 Javascript
浅谈vue中使用编辑器vue-quill-editor踩过的坑
2020/08/03 Javascript
[03:48]2014DOTA2 TI专访71DK夺冠不靠小组赛高排名
2014/07/11 DOTA
python使用__slots__让你的代码更加节省内存
2018/09/05 Python
Python3 读、写Excel文件的操作方法
2018/10/20 Python
python 实现一次性在文件中写入多行的方法
2019/01/28 Python
Python3.5基础之变量、数据结构、条件和循环语句、break与continue语句实例详解
2019/04/26 Python
浅析Windows 嵌入python解释器的过程
2019/07/26 Python
python调用matplotlib模块绘制柱状图
2019/10/18 Python
Python FtpLib模块应用操作详解
2019/12/12 Python
python实现俄罗斯方块小游戏
2020/04/24 Python
pytorch快速搭建神经网络_Sequential操作
2020/06/17 Python
python+appium+yaml移动端自动化测试框架实现详解
2020/11/24 Python
HTML5拍照和摄像机功能实战详解
2019/01/24 HTML / CSS
Sephora丝芙兰泰国官方网站:国际知名化妆品购物
2017/11/15 全球购物
美国花园雕像和家居装饰网上商店:Design Toscano
2019/03/09 全球购物
中学生爱国演讲稿
2014/09/05 职场文书
六一儿童节标语
2014/10/08 职场文书
涨价通知怎么写
2015/04/23 职场文书
学校学习型党组织建设心得体会
2019/06/21 职场文书
Python中tkinter的用户登录管理的实现
2021/04/22 Python