可兼容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获取Google AJAX Search API 数据的代码
Mar 12 PHP
php无限极分类实现的两种解决方法
Apr 28 PHP
php利用cookie实现自动登录的方法
Dec 10 PHP
WordPress中转义HTML与过滤链接的相关PHP函数使用解析
Dec 22 PHP
PHP类的声明与实例化及构造方法与析构方法详解
Jan 26 PHP
PHP实现的限制IP投票程序IP来源分析
May 04 PHP
php如何执行非缓冲查询API
Jul 22 PHP
php使用ftp远程上传文件类(完美解决主从文件同步问题的方法)
Sep 23 PHP
thinkPHP中session()方法用法详解
Dec 08 PHP
PHP实现的简单操作SQLite数据库类与用法示例
Jun 19 PHP
PHP使用两个栈实现队列功能的方法
Jan 15 PHP
Yii 访问 Gii(脚手架)时出现 403 错误
Jun 06 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实现定时执行任务的方法
2014/10/05 PHP
PHP实现限制IP访问的方法
2017/04/20 PHP
php+js实现的无刷新下载文件功能示例
2019/08/23 PHP
取键盘键位ASCII码的网页
2007/07/30 Javascript
JavaScript 加号(+)运算符号
2009/12/06 Javascript
让你的博客飘雪花超出屏幕依然看得见
2013/01/04 Javascript
Jqgrid设置全选(选择)及获取选择行的值示例代码
2013/12/28 Javascript
js验证真实姓名与身份证号是否匹配
2015/10/13 Javascript
js表单验证实例讲解
2016/03/31 Javascript
JS阻止事件冒泡行为和闭包的方法
2016/06/16 Javascript
Javascript获取随机数的实现方法
2016/06/22 Javascript
jQuery设置单选按钮radio选中/不可用的实例代码
2016/06/24 Javascript
AngularJS基础 ng-keydown 指令简单示例
2016/08/02 Javascript
关于JSON与JSONP简单总结
2016/08/16 Javascript
Vue.js双向绑定操作技巧(初级入门)
2016/12/27 Javascript
jQuery使用siblings获取某元素所有同辈(兄弟姐妹)元素用法示例
2017/01/30 Javascript
利用node.js如何搭建一个简易的即时响应服务器
2017/05/28 Javascript
React-Native 组件之 Modal的使用详解
2017/08/08 Javascript
vuejs实现折叠面板展开收缩动画效果
2018/09/06 Javascript
Vue 引入AMap高德地图的实现代码
2019/04/29 Javascript
vue使用video.js进行视频播放功能
2019/07/18 Javascript
python 基础学习第二弹 类属性和实例属性
2012/08/27 Python
Python urllib、urllib2、httplib抓取网页代码实例
2015/05/09 Python
python生成密码字典的方法
2018/07/06 Python
详解python中list的使用
2019/03/15 Python
Python 实现简单的客户端认证
2020/07/29 Python
MyHeritage美国:家族史研究和DNA测试的领先服务
2019/05/27 全球购物
什么是动态端口(Dynamic Ports)?动态端口的范围是多少?
2014/12/12 面试题
网络技术支持面试题
2013/04/22 面试题
党的群众路线对照检查材料思想汇报(学校)
2014/10/04 职场文书
领导干部作风整顿个人剖析材料
2014/10/11 职场文书
2015年招聘工作总结
2014/12/12 职场文书
办公室个人总结
2015/02/28 职场文书
师范生见习总结范文
2015/06/23 职场文书
《乘法分配律》教学反思
2016/02/24 职场文书
win10电脑关机快捷键是哪个 win10快速关机的几种方法
2022/08/14 数码科技