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 相关文章推荐
二十行语句实现从Excel到mysql的转化
Oct 09 PHP
PHP 中的批处理的实现
Jun 14 PHP
php中常用的预定义变量小结
May 09 PHP
PHP判断文件是否存在、是否可读、目录是否存在的代码
Oct 03 PHP
PHP中的函数-- foreach()的用法详解
Jun 24 PHP
CodeIgniter与PHP5.6的兼容问题
Jul 16 PHP
Yii2分页的使用及其扩展方法详解
May 23 PHP
PHP之图片上传类实例代码(加了缩略图)
Jun 30 PHP
PHP输出图像imagegif、imagejpeg与imagepng函数用法分析
Nov 14 PHP
PHP+AJAX 投票器功能
Nov 11 PHP
详细解读php的命名空间(二)
Feb 21 PHP
Yii框架中使用PHPExcel的方法分析
Jul 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
一个SQL管理员的web接口
2006/10/09 PHP
Yii框架引入coreseek分页功能示例
2019/02/08 PHP
PHP框架实现WebSocket在线聊天通讯系统
2019/11/21 PHP
Javascript打印网页部分内容的脚本
2008/11/17 Javascript
向大师们学习Javascript(视频与PPT)
2009/12/27 Javascript
JS中Iframe之间传值及子页面与父页面应用
2013/03/11 Javascript
javascript删除option选项的多种方法总结
2013/11/22 Javascript
JQuery EasyUI Layout 在from布局自适应窗口大小的实现方法
2016/05/28 Javascript
使用BootStrap和Metroui设计的metro风格微网站或手机app界面
2016/10/21 Javascript
原生JS实现简单放大镜效果
2017/02/08 Javascript
JS实现PC手机端和嵌入式滑动拼图验证码三种效果
2017/02/15 Javascript
js实现下拉菜单效果
2017/03/01 Javascript
ES6中Symbol类型用法实例详解
2017/04/06 Javascript
Vue实现自定义下拉菜单功能
2018/07/16 Javascript
JS回调函数简单易懂的入门实例分析
2019/09/29 Javascript
微信小程序修改checkbox的样式代码实例
2020/01/21 Javascript
详解element-ui动态限定的日期范围选择器代码片段
2020/07/03 Javascript
Python字符串处理函数简明总结
2015/04/13 Python
Python中set与frozenset方法和区别详解
2016/05/23 Python
python 调用c语言函数的方法
2017/09/29 Python
遗传算法之Python实现代码
2017/10/10 Python
python实现快速排序的示例(二分法思想)
2018/03/12 Python
浅谈Python在pycharm中的调试(debug)
2018/11/29 Python
pycharm设置python文件模板信息过程图解
2020/03/10 Python
基于Pyinstaller打包Python程序并压缩文件大小
2020/05/28 Python
python实现从ftp上下载文件的实例方法
2020/07/19 Python
python爬虫今日热榜数据到txt文件的源码
2021/02/23 Python
CSS3 渐变(Gradients)之CSS3 线性渐变
2016/07/08 HTML / CSS
html5 svg 中元素点击事件添加方法
2013/01/16 HTML / CSS
同学聚会欢迎辞
2014/01/14 职场文书
合同协议书格式
2014/04/18 职场文书
人事行政专员岗位职责
2014/07/23 职场文书
机关作风整顿个人整改措施思想汇报
2014/09/29 职场文书
师德先进个人材料
2014/12/20 职场文书
项目备案申请报告
2015/05/15 职场文书
汤姆索亚历险记读书笔记
2015/06/29 职场文书