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 相关文章推荐
教你IIS6的PHP最佳配置方法
Sep 05 PHP
通过html表格发电子邮件
Oct 09 PHP
NOT NULL 和NULL
Jan 15 PHP
15种PHP Encoder的比较
Mar 06 PHP
ezSQL PHP数据库操作类库
May 16 PHP
php array_walk() 数组函数
Jul 12 PHP
php使HTML标签自动补全闭合函数代码
Oct 04 PHP
php获取远程图片体积大小的实例
Nov 12 PHP
php动态变量定义及使用
Jun 10 PHP
PHP的全局错误处理详解
Apr 25 PHP
php、mysql查询当天,查询本周,查询本月的数据实例(字段是时间戳)
Feb 04 PHP
PHP实现的超长文本分页显示功能示例
Jun 04 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/10 PHP
php获取四位字母和数字的随机数的实现方法
2015/01/09 PHP
php getcwd与dirname(__FILE__)区别详解
2016/09/24 PHP
PHP配合fiddler抓包抓取微信指数小程序数据的实现方法分析
2020/01/02 PHP
JS等比例缩小图片尺寸的实例
2013/02/27 Javascript
用JavaScript计算在UTF-8下存储字符串占用字节数
2013/08/08 Javascript
为jquery的ajaxfileupload增加附加参数的方法
2014/03/04 Javascript
jQuery实现鼠标经过图片变亮其他变暗效果
2015/05/08 Javascript
js HTML5 Ajax实现文件上传进度条功能
2016/02/13 Javascript
Bootstrap组件系列之福利篇几款好用的组件(推荐)
2016/06/23 Javascript
javascript实现用户点击数量统计
2016/12/25 Javascript
NodeJS学习笔记之Module的简介
2017/03/24 NodeJs
vue+vuex+axio从后台获取数据存入vuex实现组件之间共享数据
2017/04/22 Javascript
JavaScript实现兼容IE6的收起折叠与展开效果实例
2017/09/20 Javascript
Vue自定义过滤器格式化数字三位加一逗号实现代码
2018/03/23 Javascript
JavaScript树的深度优先遍历和广度优先遍历算法示例
2018/07/30 Javascript
vue实现压缩图片预览并上传功能(promise封装)
2019/01/10 Javascript
vue element-ui table组件动态生成表头和数据并修改单元格格式 父子组件通信
2019/08/15 Javascript
vue vant中picker组件的使用
2020/11/03 Javascript
在Django框架中编写Contact表单的教程
2015/07/17 Python
Python使用Selenium+BeautifulSoup爬取淘宝搜索页
2018/02/24 Python
python版本的仿windows计划任务工具
2018/04/30 Python
Python修改文件往指定行插入内容的实例
2019/01/30 Python
Django基础知识 URL路由系统详解
2019/07/18 Python
python快速编写单行注释多行注释的方法
2019/07/31 Python
python [:3] 实现提取数组中的数
2019/11/27 Python
python怎么自定义捕获错误
2020/06/29 Python
如何基于Python爬取隐秘的角落评论
2020/07/02 Python
Python importlib模块重载使用方法详解
2020/10/13 Python
python实现马丁策略回测3000只股票的实例代码
2021/01/22 Python
Python中lru_cache的使用和实现详解
2021/01/25 Python
梅西酒窖:Macy’s Wine Cellar
2018/01/07 全球购物
采购部经理岗位职责
2014/02/10 职场文书
先进工作者事迹材料
2014/12/23 职场文书
Python使用openpyxl批量处理数据
2021/06/23 Python
python实现一个简单的贪吃蛇游戏附代码
2022/06/28 Python