可兼容php5与php7的cURL文件上传功能实例分析


Posted in PHP onMay 11, 2018

本文实例讲述了可兼容php5与php7的cURL文件上传功能。分享给大家供大家参考,具体如下:

为啥要写这个示例

最近修改一个项目,需要通过cURL上传文件。

记得之前做过类似实现的,于是翻出来之前的代码,使用的是“@”前缀方式。

但同样的方法现在不行了!后来发现,是版本兼容问题。

奔着开源分享的精神,同时避免自己遗忘,于是写了下面的示例程序。

示例程序

特别说明:

共3个文件,都放在web根目录的test目录下,同时保证该目录可写。上传的图片也会保存在该目录。

如果要将程序文件放在其他目录运行,必须更改php代码中的相关URL,否则示例可能无法运行。

<html>
<head>
  <title>上传示例</title>
</head>
<body>
  <div>下面上传文件到中间脚本:</div>
  <br />
  <form action="upload.php" method="post" enctype="multipart/form-data">
    选择文件:
    <input type="file" name="file" />
    <input type="submit" value="上传" />
  </form>
</body>
</html>
<?php
/**
 * 接收通过浏览器上传的文件
 *
 * @author Straiway<straiway@qq.com>
 * @site  http://straiway.sinaapp.com
 */
if (empty($_FILES['file'])) {
  exit('没有上传指定名称的文件');
}
// 先保存到本地,再上传
$file   = $_FILES['file'];
$file_name = __DIR__ . "/{$file['name']}";
move_uploaded_file($_FILES['file']['tmp_name'], $file_name);
// 本地测试时,可能需要更改下面的URL
$ch = curl_init('http://localhost/test/upload_via_curl.php');
// 从php5.5开始,反对使用"@"前缀方式上传,可以使用CURLFile替代;
// 据说php5.6开始移除了"@"前缀上传的方式
if (class_exists('CURLFile')) {
  $file = new CURLFile($file_name);
  // 禁用"@"上传方法,这样就可以安全的传输"@"开头的参数值
  curl_setopt($ch, CURLOPT_SAFE_UPLOAD, true);
} else {
  $file = "@{$file_name}";
}
// 从php5.2开始,要上传文件,必须给CURLOPT_POSTFIELDS传递数组,而不是字符串。
// 也只有传递数组,http头部的"Content-Type"才会设置成"multipart/form-data"
curl_setopt($ch, CURLOPT_POSTFIELDS, array('file_via_curl' => $file));
// 将传输结果作为curl_exec的返回值,而不是直接输出
curl_setopt($ch, CURLOPT_RETURNTRANSFER, true);
$result = curl_exec($ch);
$error = curl_error($ch);
if ($result) {
  $result_array = json_decode($result, true);
  if ($result_array) {
    if ($result_array['status']) {
      exit("上传成功!curl返回图片地址:{$result_array['data']['url']}<br /><img src='{$result_array['data']['url']}' />");
    } else {
      exit("curl上传失败!错误信息:{$result['info']}");
    }
  } else {
    exit("发生错误,curl返回结果:{$result}");
  }
} else {
  exit('curl请求发生错误' . var_export($error, true));
}
<?php
/**
 * 接受通过curl上传的文件。
 *
 * @author Straiway<straiway@qq.com>
 * @site  http://straiway.sinaapp.com
 */
if (empty($_FILES['file_via_curl'])) {
  $return = array('status' => 0, 'info' => '没有上传指定名称的文件');
} else {
  // 保存文件
  $file = $_FILES['file_via_curl'];
  // 重命名文件,便于识别
  $base_name = explode('.', $file['name']);
  $base_name[0] .= '_upload_var_curl';
  $base_name = implode('.', $base_name);
  $file_name = __DIR__ . "/{$base_name}";
  if (move_uploaded_file($file['tmp_name'], $file_name)) {
    // 本地测试时,可能需要更改下面的URL
    $url  = "http://localhost/test/{$base_name}";
    $return = array('status' => 1, 'info' => '上传成功', 'data' => array('url' => $url));
  } else {
    $return = array('status' => 0, 'info' => '上传失败');
  }
}
exit(json_encode($return));

参考资料

希望本文所述对大家PHP程序设计有所帮助。

PHP 相关文章推荐
小偷PHP+Html+缓存
Dec 20 PHP
PHP编程中字符串处理的5个技巧小结
Nov 13 PHP
rephactor 优秀的PHP的重构工具
Jun 09 PHP
PHP得到某段时间区间的时间戳 php定时任务
Apr 12 PHP
克隆一个新项目的快捷方式
Apr 10 PHP
php中cookie实现二级域名可访问操作的方法
Nov 11 PHP
PHP 魔术变量和魔术函数详解
Feb 25 PHP
php实现的IMEI限制的短信验证码发送类
May 05 PHP
PHP实现过滤各种HTML标签
May 17 PHP
浅谈php错误提示及查错方法
Jul 14 PHP
又拍云异步上传实例教程详解
Apr 19 PHP
php解析非标准json、非规范json的方式实例
May 10 PHP
PHP5.0~5.6 各版本兼容性cURL文件上传功能实例分析
May 11 #PHP
PHP7基于curl实现的上传图片功能
May 11 #PHP
关于ThinkPHP中的异常处理详解
May 11 #PHP
PHP基于递归算法解决兔子生兔子问题
May 11 #PHP
PHP7如何开启Opcode打造强悍性能详解
May 11 #PHP
laravel项目利用twemproxy部署redis集群的完整步骤
May 11 #PHP
PHP实现搜索时记住状态的方法示例
May 11 #PHP
You might like
php实现递归抓取网页类实例
2015/04/03 PHP
php文件读取方法实例分析
2015/06/20 PHP
PHP实现的日历功能示例
2018/09/01 PHP
禁止刷新,回退的JS
2006/11/25 Javascript
javascript Math.random()随机数函数
2009/11/04 Javascript
js中巧用cssText属性批量操作样式
2011/03/13 Javascript
JS在textarea光标处插入文本的小例子
2013/03/22 Javascript
Jquery实现textarea根据文本内容自适应高度
2015/04/03 Javascript
JS实现滑动菜单效果代码(包括Tab,选项卡,横向等效果)
2015/09/24 Javascript
javascript电商网站抢购倒计时效果实现
2015/11/19 Javascript
JavaScript实现Base64编码转换
2016/04/23 Javascript
ionic由于使用了header和subheader导致被遮挡的问题的两种解决方法
2016/09/22 Javascript
微信小程序(应用号)开发新闻客户端实例
2016/10/24 Javascript
微信小程序 用户数据解密详细介绍
2017/01/09 Javascript
Angular.js中ng-include用法及多标签页面的实现方式详解
2017/05/07 Javascript
vue项目持久化存储数据的实现代码
2018/10/01 Javascript
小程序云开发实战小结
2018/10/25 Javascript
在vue中阻止浏览器后退的实例
2019/11/06 Javascript
JS Web Flex弹性盒子模型代码实例
2020/03/10 Javascript
详解JavaScript中的Object.is()与&quot;===&quot;运算符总结
2020/06/17 Javascript
vue打包npm run build时候界面报错的解决
2020/08/13 Javascript
Python中functools模块的常用函数解析
2016/06/30 Python
Python用模块pytz来转换时区
2016/08/19 Python
python调用c++传递数组的实例
2019/02/13 Python
tensorflow求导和梯度计算实例
2020/01/23 Python
解决c++调用python中文乱码问题
2020/07/29 Python
python Gabor滤波器讲解
2020/10/26 Python
荷兰包包购物网站:The Little Green Bag
2018/03/17 全球购物
三个Unix的命令面试题
2015/04/12 面试题
百日安全活动总结
2014/05/04 职场文书
白莲教口号
2014/06/18 职场文书
运动会广播稿100字
2014/09/14 职场文书
SpringCloud的JPA连接PostgreSql的教程
2021/06/26 Java/Android
Java实现聊天机器人完善版
2021/07/04 Java/Android
阿里云日志过滤器配置日志服务
2022/04/09 Servers
SQLyog的下载、安装、破解、配置教程(MySQL可视化工具安装)
2022/09/23 MySQL