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 相关文章推荐
PHP4中实现动态代理
Oct 09 PHP
php 设计模式之 工厂模式
Dec 19 PHP
php下关于Cannot use a scalar value as an array的解决办法
Aug 08 PHP
php设计模式 Facade(外观模式)
Jun 26 PHP
PHP IF ELSE简化/三元一次式的使用
Aug 22 PHP
php cookie名使用点号(句号)会被转换
Oct 23 PHP
php计算年龄精准到年月日
Nov 17 PHP
PHP实现长文章分页实例代码(附源码)
Feb 03 PHP
常用PHP封装分页工具类
Jan 14 PHP
PHP微信公众号开发之微信红包实现方法分析
Jul 14 PHP
PHP 的Opcache加速的使用方法
Dec 29 PHP
PHP基于phpqrcode类生成二维码的方法详解
Mar 14 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
关于shopex同步ucenter的redirect问题,导致script不运行
2013/04/10 PHP
phpmyadmin中禁止外网使用的方法
2014/11/04 PHP
laravel实现Auth认证,登录、注册后的页面回跳方法
2019/09/30 PHP
基于jquery的修改当前TAB显示标题的代码
2010/12/11 Javascript
JS字符串处理实例代码
2013/08/05 Javascript
实现51Map地图接口(示例代码)
2013/11/22 Javascript
JavaScript中判断变量是数组、函数或是对象类型的方法
2015/02/25 Javascript
jQuery中$this和$(this)的区别介绍(一看就懂)
2015/07/06 Javascript
JavaScript+html5 canvas绘制渐变区域完整实例
2016/01/26 Javascript
分享我对JS插件开发的一些感想和心得
2016/02/04 Javascript
基于AngularJS+HTML+Groovy实现登录功能
2016/02/17 Javascript
JavaScript中利用jQuery绑定事件的几种方式小结
2016/03/06 Javascript
angular实现spa单页面应用实例
2017/07/10 Javascript
canvas轨迹回放功能实现
2017/12/20 Javascript
jQuery实现checkbox全选功能完整实例
2018/07/12 jQuery
Vue axios全局拦截 get请求、post请求、配置请求的实例代码
2018/11/28 Javascript
Vue的路由及路由钩子函数的实现
2019/07/02 Javascript
原生JS实现京东查看商品点击放大
2020/12/21 Javascript
[02:24]DOTA2痛苦女王 英雄基础教程
2013/11/26 DOTA
[48:21]Mski vs VGJ.S Supermajor小组赛C组 BO3 第一场 6.3
2018/06/04 DOTA
python网络编程学习笔记(九):数据库客户端 DB-API
2014/06/09 Python
Python中使用Boolean操作符做真值测试实例
2015/01/30 Python
Python的Django框架中消息通知的计数器实现教程
2016/06/13 Python
django 外键model的互相读取方法
2018/12/15 Python
python调用staf自动化框架的方法
2018/12/26 Python
python pygame实现方向键控制小球
2019/05/17 Python
Pandas 重塑(stack)和轴向旋转(pivot)的实现
2019/07/22 Python
django实现日志按日期分割
2020/05/21 Python
Java多线程实现四种方式原理详解
2020/06/02 Python
Python 基于jwt实现认证机制流程解析
2020/06/22 Python
CSS3实现文字波浪线效果示例代码
2016/11/20 HTML / CSS
全球领先的在线cosplay服装商店:RoleCosplay
2020/01/18 全球购物
食品安全检查制度
2014/02/03 职场文书
质量月口号
2014/06/20 职场文书
建筑专业毕业生求职信
2014/09/30 职场文书
使用Redis实现实时排行榜功能
2021/07/02 Redis