可兼容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 相关文章推荐
windows下PHP APACHE MYSQ完整配置
Jan 02 PHP
PHP与MySQL开发的8个技巧小结
Dec 17 PHP
PHP遍历二维数组的代码
Apr 22 PHP
php代码收集表单内容并写入文件的代码
Jan 29 PHP
解析PHP中empty is_null和isset的测试
Jun 29 PHP
排序算法之PHP版快速排序、冒泡排序
Apr 09 PHP
php数据访问之增删改查操作
May 09 PHP
linux平台编译安装PHP7并安装Redis扩展与Swoole扩展实例教程
Sep 30 PHP
PHP钩子与简单分发方式实例分析
Sep 04 PHP
PHP常见过waf webshell以及最简单的检测方法
May 21 PHP
php下的原生ajax请求用法实例分析
Feb 28 PHP
tp5.1 框架数据库高级查询技巧实例总结
May 25 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脚本的10个技巧(5)
2006/10/09 PHP
PHP伪静态写法附代码
2008/06/20 PHP
在命令行下运行PHP脚本[带参数]的方法
2010/01/22 PHP
深入php多态的实现详解
2013/06/09 PHP
详解php的socket通信
2015/08/11 PHP
php-fpm.conf配置文件中文说明详解及重要参数说明
2018/10/10 PHP
JS中图片缓冲loading技术的实例代码
2013/08/29 Javascript
基于jquery实现等比缩放图片
2014/12/03 Javascript
举例详解JavaScript中Promise的使用
2015/06/24 Javascript
如何让一个json文件显示在表格里【实现代码】
2016/05/09 Javascript
vue中mint-ui环境搭建详细介绍
2017/04/06 Javascript
Node.js连接mongodb实例代码
2017/06/06 Javascript
基于Two.js实现星球环绕动画效果的示例
2017/11/06 Javascript
vue.js指令v-for使用以及下标索引的获取
2019/01/31 Javascript
jQuery实现的卷帘门滑入滑出效果【案例】
2019/02/18 jQuery
微信小程序mpvue点击按钮获取button值的方法
2019/05/29 Javascript
关于layui时间回显问题的解决方法
2019/09/24 Javascript
react antd表格中渲染一张或多张图片的实例
2020/10/28 Javascript
python采用getopt解析命令行输入参数实例
2014/09/30 Python
Python中几种操作字符串的方法的介绍
2015/04/09 Python
python fabric实现远程部署
2017/01/05 Python
浅谈python和C语言混编的几种方式(推荐)
2017/09/27 Python
Python实现判断字符串中包含某个字符的判断函数示例
2018/01/08 Python
Python判断一个文件夹内哪些文件是图片的实例
2018/12/07 Python
python实现字符串加密成纯数字
2019/03/19 Python
Python性能分析工具py-spy原理用法解析
2020/07/27 Python
Hunter Boots美国官方网站:赫特威灵顿雨靴
2018/06/16 全球购物
求职者应聘的自我评价
2013/10/16 职场文书
行政文员岗位职责
2015/02/04 职场文书
小学教师个人总结
2015/02/05 职场文书
2015年教研室工作总结范文
2015/05/23 职场文书
植树节新闻稿
2015/07/17 职场文书
公司周年庆典致辞
2015/07/30 职场文书
idea下配置tomcat避坑详解
2022/04/12 Servers
python模拟浏览器 使用selenium进入好友QQ空间并留言
2022/04/12 Python
vue 把二维或多维数组转一维数组
2022/04/24 Vue.js