可兼容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下XDebug 手工配置与使用说明
Jul 11 PHP
PHP逐行输出(ob_flush与flush的组合)
Feb 04 PHP
PHP面向对象三大特点学习(充分理解抽象、封装、继承、多态)
May 07 PHP
php使HTML标签自动补全闭合函数代码
Oct 04 PHP
基于PHP读取csv文件内容的详解
Jun 18 PHP
php按百分比生成缩略图的代码分享
May 10 PHP
PHP 面向对象程序设计(oop)学习笔记 (二) - 静态变量的属性和方法及延迟绑定
Jun 12 PHP
美图秀秀web开放平台--PHP流式上传和表单上传示例分享
Jun 22 PHP
ThinkPHP有变量的where条件分页实例
Nov 03 PHP
PHP正则匹配日期和时间(时间戳转换)的实例代码
Dec 14 PHP
thinkPHP5.0框架模块设计详解
Mar 18 PHP
解决laravel groupBy 对查询结果进行分组出现的问题
Oct 09 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 5.0对象模型深度探索之类的静态成员
2008/03/27 PHP
PHP 获取目录下的图片并随机显示的代码
2009/12/28 PHP
PHP中$_FILES的使用方法及注意事项说明
2014/02/14 PHP
javascript some()函数用法详解
2014/11/13 PHP
php操作xml并将其插入数据库的实现方法
2016/09/08 PHP
用js判断页面刷新或关闭的方法(onbeforeunload与onunload事件)
2012/06/22 Javascript
关于jquery ajax 调用带参数的webservice返回XML数据一个小细节
2012/07/31 Javascript
给artDialog 5.02 增加ajax get功能详细介绍
2012/11/13 Javascript
生成二维码方法汇总
2014/12/26 Javascript
javascript每日必学之多态
2016/02/23 Javascript
react的滑动图片验证码组件的示例代码
2019/02/27 Javascript
NodeJs实现简易WEB上传下载服务器
2019/08/10 NodeJs
JavaScript实现拖拽盒子效果
2020/02/06 Javascript
vue element实现表格合并行数据
2020/11/30 Vue.js
详解Python 多线程 Timer定时器/延迟执行、Event事件
2019/06/27 Python
python模块和包的应用BASE_PATH使用解析
2019/12/14 Python
python绘制雪景图
2019/12/16 Python
解决keras使用cov1D函数的输入问题
2020/06/29 Python
python开发入门——set的使用
2020/09/03 Python
Python lxml库的简单介绍及基本使用讲解
2020/12/22 Python
25个CSS3动画按钮和菜单教程分享
2012/10/03 HTML / CSS
阿迪达斯俄罗斯官方商城:adidas俄罗斯
2017/03/08 全球购物
Hanky Panky官方网站:内衣和睡衣
2019/07/25 全球购物
Oasis服装官网:时尚女装在线
2020/07/09 全球购物
专业幼师实习生自我鉴定范文
2013/12/08 职场文书
开水果连锁店创业计划书
2013/12/29 职场文书
家长寄语大全
2014/04/02 职场文书
青春寄语大全
2014/04/09 职场文书
安全施工责任书
2014/08/25 职场文书
2014财务部年度工作总结
2014/12/08 职场文书
介绍信样本
2015/01/31 职场文书
交通事故赔偿起诉书
2015/05/20 职场文书
合理缓解职场压力,让你随时保持最佳状态!
2019/06/21 职场文书
2019年员工旷工保证书!
2019/06/28 职场文书
如何写一份具有法律效力的借款协议书?
2019/07/02 职场文书
Nginx报404错误的详细解决方法
2022/07/23 Servers