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&amp;mysql(三)
Oct 09 PHP
模仿OSO的论坛(五)
Oct 09 PHP
按上下级层次关系输出内容的PHP代码
Jul 17 PHP
PHP求最大子序列和的算法实现
Jun 24 PHP
PHP在获取指定目录下的目录,在获取的目录下面再创建文件,多平台
Aug 03 PHP
php使用websocket示例详解
Mar 12 PHP
php smarty truncate UTF8乱码问题解决办法
Jun 13 PHP
php检查字符串中是否有外链的方法
Jul 29 PHP
PHP实现导出带样式的Excel
Aug 28 PHP
php判断是否连接上网络的方法实例详解
Dec 14 PHP
php-beanstalkd消息队列类实例分享
Jul 19 PHP
修改yii2.0用户登录使用的user表为其它的表实现方法(推荐)
Aug 01 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学习笔记 [预定义数组(超全局数组)]
2011/06/09 PHP
PHP引用返回用法示例
2016/05/28 PHP
Yii2实现增删改查后留在当前页的方法详解
2017/01/13 PHP
JS 对象介绍
2010/01/20 Javascript
通过javascript的匿名函数来分析几段简单有趣的代码
2010/06/29 Javascript
利用JS自动打开页面上链接的实现代码
2011/09/25 Javascript
jQuery动态背景图片效果实现方法
2015/07/03 Javascript
BootStrapTable服务器分页实例解析
2016/12/20 Javascript
BootStrap表单控件之文本域textarea
2017/05/23 Javascript
基于 Vue 的树形选择组件的示例代码
2017/08/18 Javascript
Three.js实现绘制字体模型示例代码
2017/09/26 Javascript
jQuery实现碰到边缘反弹的动画效果
2018/02/24 jQuery
JavaScript new对象的四个过程实例浅析
2018/07/31 Javascript
Bootstrap的aria-label和aria-labelledby属性实例详解
2018/11/02 Javascript
vue2.0 如何在hash模式下实现微信分享
2019/01/22 Javascript
关于angular引入ng-zorro的问题浅析
2020/09/09 Javascript
python执行等待程序直到第二天零点的方法
2015/04/23 Python
黑科技 Python脚本帮你找出微信上删除你好友的人
2016/01/07 Python
在python中用print()输出多个格式化参数的方法
2019/07/16 Python
python实现知乎高颜值图片爬取
2019/08/12 Python
Python 类的魔法属性用法实例分析
2019/11/21 Python
Python生成个性签名图片获取GUI过程解析
2019/12/16 Python
Pytorch DataLoader 变长数据处理方式
2020/01/08 Python
python 爬虫 实现增量去重和定时爬取实例
2020/02/28 Python
python字符串常用方法及文件简单读写的操作方法
2020/03/04 Python
idea2020手动安装python插件的实现方法
2020/07/17 Python
Biblibili视频投稿接口分析并以Python实现自动投稿功能
2021/02/05 Python
CSS3 background-image颜色渐变的实现代码
2018/09/13 HTML / CSS
Radley英国官网:英国莱德利小狗包
2019/03/21 全球购物
新西兰最大、占有率最高的综合性药房:PharmacyDirect药房中文网
2020/11/03 全球购物
伦敦鲜花递送:Flower Station
2021/02/03 全球购物
什么是岗位职责
2013/11/12 职场文书
高中毕业生自我鉴定例文
2013/12/29 职场文书
结婚典礼证婚词
2014/01/11 职场文书
2014三年级班主任工作总结
2014/12/05 职场文书
六一文艺汇演主持词
2015/06/30 职场文书