可兼容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中通过smtp发邮件的类,测试通过
Jan 22 PHP
PHP 输出缓存详解
Jun 20 PHP
PHP新手用的Insert和Update语句构造类
Mar 31 PHP
php判断上传的Excel文件中是否有图片及PHPExcel库认识
Jan 11 PHP
PHP中构造函数和析构函数解析
Oct 10 PHP
php实现字符串首字母转换成大写的方法
Mar 17 PHP
php类的定义与继承用法实例
Jul 07 PHP
PHP+AJAX实现投票功能的方法
Sep 28 PHP
PHP用正则匹配form表单中所有元素的类型和属性值实例代码
Feb 28 PHP
PHP 中使用explode()函数切割字符串为数组的示例
May 06 PHP
PHP7内核CGI与FastCGI详解
Apr 14 PHP
laravel unique验证、确认密码confirmed验证以及密码修改验证的方法
Oct 16 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
漂亮但不安全的CTB
2006/10/09 PHP
Email+URL的判断和自动转换函数
2006/10/09 PHP
PHP 编程的 5个良好习惯
2009/02/20 PHP
php生成随机密码的几种方法
2011/01/17 PHP
php轻松实现中英文混排字符串截取
2014/05/28 PHP
php CI框架插入一条或多条sql记录示例
2014/07/29 PHP
Laravel中Trait的用法实例详解
2016/03/16 PHP
JavaScript基本对象
2007/01/11 Javascript
javascript数组快速打乱重排的方法
2014/01/02 Javascript
JS获取图片lowsrc属性的方法
2015/04/01 Javascript
基于Bootstrap实现图片轮播效果
2016/05/22 Javascript
BootStrap中的table实现数据填充与分页应用小结
2016/05/26 Javascript
使用Angular.js开发的注意事项
2016/10/19 Javascript
微信小程序 高德地图SDK详解及简单实例(源码下载)
2017/01/11 Javascript
Omi v1.0.2发布正式支持传递javascript表达式
2017/03/21 Javascript
详解从零搭建 vue2 vue-router2 webpack3 工程
2017/11/22 Javascript
解决vue 绑定对象内点击事件失效问题
2018/09/05 Javascript
js实现前面自动补全位数的方法
2018/10/10 Javascript
如何安装控制器JavaScript生成插件详解
2018/10/21 Javascript
你可能从未使用过的11+个JavaScript特性(小结)
2020/01/08 Javascript
vue v-model的用法解析
2020/10/19 Javascript
vue+iview实现文件上传
2020/11/17 Vue.js
[01:18:21]EG vs TNC Supermajor小组赛B组败者组第一轮 BO3 第一场 6.2
2018/06/03 DOTA
Python命令行参数解析模块optparse使用实例
2015/04/13 Python
Python中的异常处理相关语句基础学习笔记
2016/07/11 Python
详解如何在Apache中运行Python WSGI应用
2019/01/02 Python
8段用于数据清洗Python代码(小结)
2019/10/31 Python
Linux Interview Questions For software testers
2012/06/02 面试题
优秀医生事迹材料
2014/02/12 职场文书
运动会口号16字
2014/06/07 职场文书
党员干部反四风对照检查材料思想汇报
2014/09/14 职场文书
2014国庆节主题活动方案:快乐的国庆节
2014/09/16 职场文书
Python WSGI 规范简介
2021/04/11 Python
python的列表生成式,生成器和generator对象你了解吗
2022/03/16 Python
vue3种table表格选项个数的控制方法
2022/04/14 Vue.js
Golang gRPC HTTP协议转换示例
2022/06/16 Golang