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+Html+缓存
Dec 20 PHP
php 用checkbox一次性删除多条记录的方法
Feb 23 PHP
PHP和Shell实现检查SAMBA与NFS Server是否存在
Jan 07 PHP
php和editplus正则表达式去除空白行
Apr 17 PHP
CodeIgniter 完美解决URL含有中文字符串
May 13 PHP
Yii框架中sphinx索引配置方法解析
Oct 18 PHP
PHP策略模式定义与用法示例
Jul 27 PHP
快速解决PHP调用Word组件DCOM权限的问题
Dec 27 PHP
php empty 函数判断结果为空但实际值却为非空的原因解析
May 28 PHP
PHP asXML()函数讲解
Feb 03 PHP
thinkphp5框架前后端分离项目实现分页功能的方法分析
Oct 08 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集成套件服务器xampp安装使用教程(适合第一次玩PHP的新手)
2015/06/03 PHP
利用PHP将图片转换成base64编码的实现方法
2016/09/13 PHP
php抽象方法和抽象类实例分析
2016/12/07 PHP
Laravel实现定时任务的示例代码
2017/08/10 PHP
从零开始学习jQuery (四) jQuery中操作元素的属性与样式
2011/02/23 Javascript
javacript使用break内层跳出外层循环分析
2015/01/12 Javascript
jQuery性能优化技巧分析
2015/02/20 Javascript
Position属性之relative用法
2015/12/14 Javascript
第一篇初识bootstrap
2016/06/21 Javascript
js编写一个简单的产品放大效果代码
2016/06/27 Javascript
JavaScript实现分页效果
2017/03/28 Javascript
vue中使用localstorage来存储页面信息
2017/11/04 Javascript
vue自定义过滤器创建和使用方法详解
2017/11/06 Javascript
es6在react中的应用代码解析
2017/11/08 Javascript
利用JS测试目标网站的打开响应速度
2017/12/01 Javascript
vue组件详解之使用slot分发内容
2018/04/09 Javascript
vue使用jsonp抓取qq音乐数据的方法
2018/06/21 Javascript
vue底部加载更多的实例代码
2018/06/29 Javascript
详解Angular-ui-BootStrap组件的解释以及使用
2018/07/13 Javascript
vue+element-ui实现表格编辑的三种实现方式
2018/10/31 Javascript
Python编码时应该注意的几个情况
2013/03/04 Python
微信跳一跳自动运行python脚本
2018/01/08 Python
python3.6使用tkinter实现弹跳小球游戏
2019/05/09 Python
Python 函数用法简单示例【定义、参数、返回值、函数嵌套】
2019/09/20 Python
Python 导入文件过程图解
2019/10/15 Python
Python使用循环神经网络解决文本分类问题的方法详解
2020/01/16 Python
Pytorch十九种损失函数的使用详解
2020/04/29 Python
通过实例解析python and和or使用方法
2020/11/14 Python
用python监控服务器的cpu,磁盘空间,内存,超过邮件报警
2021/01/29 Python
详解HTML5中ol标签的用法
2015/09/08 HTML / CSS
HTML5 canvas基本绘图之填充样式实现
2016/06/27 HTML / CSS
html5 初试 indexedDB(推荐)
2016/07/21 HTML / CSS
Sunglass Hut巴西网上商店:男女太阳镜
2020/10/04 全球购物
如何实现一个自定义类的序列化
2012/05/22 面试题
学生会竞选演讲稿
2014/04/24 职场文书
python使用pymysql模块操作MySQL
2021/06/16 Python